集合
1.可以动态的保存任意多个对象,使用比较方便。
2.提供了一系列方便的操作对象的方法:add,remove,set,get等。
3.使用集合添加,删除新元素的示意代码,简介明了。
集合主要是两种(单列集合,双列集合)
Collection 接口有两个重要的子接口 List ,Set,他们的实现子类都是单列集合
Map 接口的视线子类四双列结合,存放的是K-V键值对
public class Demo {
public static void main(String[] args) {
ArrayList arrraylist = new ArrayList<>(); //单列集合
arrraylist.add("jack"); //单列数据
arrraylist.add("tom");
HashMap hashMap = new HashMap<>(); //双列集合
hashMap.put("No1","北京"); //双列数据
hashMap.put("No2","上海");
}
}
集合体系图
Collection 接口实现类的特点
1.collection 实现子类可以存放多个元素,每个元素可以是 Object。
2.有些 Collection 的实现类,有些是有序的(List),有些不是有序(Set)。
3.Collection 接口没有直接的实现子类,是通过他的子接口 Set 和 List 来实现的。
Collection 接口遍历元素方式:
1.使用 Iterator(迭代器)
(1)Iterator 对象称为迭代器,主要用于遍历 Collection 集合中的元素。
(2)所有实现了 Collection 接口的集合类都有一个 iterator() 方法,用以返回一个实现了 Iterator
接口的对象,即可以返回一个迭代器。
(3)Iterator 的结构。
(4)Iterator 仅用于遍历集合,Iterator 本身并不存放对象。
迭代器的执行原理:
Iterator iterator = coll.iterator(); //得到一个集合的迭代器
//hasNext(); 判断是否还有下一个元素
while(iterator.hasNext()){
//next(); 作用:1.下移 2.将下移以后集合位置上的元素返回
System.out.println(interator.next());
}
增强for循环
可以替代 iterator 迭代器,特点:增强 for 循环就是简化版的 iterator,本质一样,只能用于遍历集合或数组。
基本语法:
for (元素类型 元素名:集合名或数组名) {
访问元素
}
增强for循环底层仍然是迭代器,增强for循环可以理解为简化版的迭代器遍历。
List 接口方法
1.List 集合类中元素有序(即添加顺序和取出顺序一致),且可以重复。
2.List集合中的每个元素都有其对应的顺序索引,即支持索引,索引是从 0 开始的。
3.List容器中的每个元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
List 的三种遍历方式
1.使用 iterator
Iterator iterator = col.iterator();
while(iter.hasNext()) {
Object o = iter.next();
}
2.使用增强 for
for(Object o:col){
}
3.使用普通 for
for (int i = 0;i < list.size();i++){
Object objcect = list.get(i);
System.out.println(object);
}
使用LinkedList 完成 使用方式和ArrayList 一样
ArrayList 的注意事项
1.permits all elements, including null, ArrayList 可以加入null,并且多个
2.ArrayList 是由数组实现数据存储的
3.ArrayList 基本等同于 Vector,除了 ArrayList 是线程不安全(执行效率高),在多线程下,不建议使用ArrayList。
Vector 和 ArrayList 底层机构的比较
底层结构 | 线程安全(同步)效率 | 扩容倍数 | |
ArrayList | 可变数组 | 不安全,效率高 | 如果有参构造1.5倍 如果无参 1.第一次10 2.从第二次开始按1.5倍扩 |
Vector | 可变数组 | 安全,效率不高 | 如果是无参,默认10,满后,就按2倍扩容 如果指定大小,则每次直接按2倍扩 |
ArrayList 和 LinkedList 的比较
底层结构 | 增删的效率 | 改查的效率 | |
ArrayList | 可变数组 | 较低,数组扩容 | 较高 |
LinkedList | 双向链表 | 较高,通过链表追加 | 较低 |
如何选择ArrayList 和LinkedList
1.如果我们改查的操作多,选择ArrayList
2.如果我们增删的操作多,选择LinkedList
3.一般来说,大部分情况下会选择ArrayList
Set接口方法
1.无序(添加和取出的顺序不一致),没有索引
2.不允许重复元素,所以最多包含一个null
和 List接口一样,Set 接口也是Collection 接口的子接口,因此,常用方法和 Collection 接口的接口一样
Set 接口的遍历方式
因为是Collection 接口的子接口,所以同Collection 的遍历方式一样
1.可以使用迭代器
2.增强for
3.不能使用索引方式来获取
Set 接口的实现类的对象,不能存放重复的元素,可以添加一个null。
Set接口对象存放数据是无序的(即添加和取出的顺序是不一致的),取出的顺序虽然不是添加的顺序,但他是固定的。
HashSet 的全面说明
1.HashSet 实现了Set接口。
2.HashSet 实际上是HashMap。
3.可以存放 null,但是只能有一个 null。
4.HashSet 不保证元素是有序的,取决 hash 后,再确定索引的结果。
5.不能有重复元素/对象。
HashSet 的底层是HashMap,HashMap 的底层是(数组,链表,红黑树)
LinkedHashSet 的全面说明
1.LinkedHashSet 是 HashSet 的子类。
2.LinkedHashSet 底层是 LinkedHashMap 底层维护了一个 数组 + 双链表。
3.LinkedHashSet 根据元素的 HashCode 值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
4.HashSet 不允许添加重复元素。
Map 接口特点
1.Map 与 Collection 并列存在,用于保存具有映射关系的数据:key-value。
2.Map 中的key 与 value 可以是任何引用类型的数据,会封装到 HashMap$Node
对象中。
3.Map 中的 key 不允许c重复。
4.Map 中的value 可以重复。
5.Map 的 key 可以为 null,value 也可以为 null,key 为 null 只能有一个,value 为 null 可以多个。
6.常用 String 类作为 Map 的 key。
7.key 和 value 之间存在单向一对一关系,即通过指定的key 总能找到对应的 value。
Map 遍历方法
1.containKey:查找键是否存在
2.KeySet:获取所有的键
3.entrySet:获取所有关系
4.values:获取所有的值
HashMap 小结:
1.HashMap 是以 key-value 的方式来存储数据
2.key 不能重复,但是值可以重复,允许使用 null 键和 null 值
3.如果添加相同的 key,则会覆盖原来的key-value,等同于修改(key 不会替换,value 会替换)
4.与HashSet 一样,不能保证映射的顺序,因为底层是以 hash 表的方式来存储的
5.HashMap 没有实现同步,因此线程是不安全的。
HashTable 的基本介绍
1.存放的元素是键值对。
2.HashTable 的键和值都不能为空。
3.HashTable 的使用方法基本上和 HashMap 一样。
4.HashTable 线程是安全的,HashMap 是线程不安全的。
HashTable 和 HashMap 的对比
线程安全(同步) | 效率 | 允许null键和null值 | |
HashMap | 不安全 | 高 | 可以 |
HashTable | 安全 | 较低 | 不可以 |
怎么选择集合实现类
Ending:
OK,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~