Collection (包含List Set Queue)
Collection继承树 (黑色阴影代表常用)
元素有放入顺序,元素可重复 (和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变)
- ArrayList
底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
可扩展数组的形式 初始大小10,扩容增量:原容量的0.5 倍+1(如 ArrayList的容量为10,一次扩容后是容量为16) 查询快
- LinkedList
底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
初始大小10,以2倍的大小扩展 (单项链表的形式) 增删快
- Vector (子接口stack)
底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
为什么线程安全?
因为其底层方法加了锁,synchronized同步锁。
初始大小10,扩容增量:原容量的 1倍 如 Vector的容量为10,一次扩容后是容量为20 增删快
元素无放入顺序,元素不可重复,重复元素会覆盖掉
查询元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变
为什么Set是唯一的?
1.不可重复的原因是,底层索引的储存方式是通过还是hash表储存,确保元素的唯一性
2. 存储过程:
先通过hash()算法函数生成一个Int类型hashCode散列值的,与所有hashCode比较
相同-》使用equals在进行比较,equals判断(相同不可插入,不相同直接插入)。
不相同-》直接插入)
初始大小16,加载因子是0.75(指的是插入的数据到达总容量的75%的时候开始扩展。扩容增量:原容量的 1 倍 如 HashSet的容量为16,一次扩容后是容量为32)
-
HashSet
仅接收一次,不可重复,并做内部排序。使用hash表(数组)存储元素 -
LinkedHashSet
底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。 -
TreeSet
底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
TreeSet依据什么确定自身的唯一性,有序性? 根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造)。
自然排序: 要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;
比较器排序: 需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;
Queue (基本不使用)
有序,可重复 已经不太适用。
List和Set的区别图解
Map
为什么Map的key是唯一的? 因为它底层实现了set的方法?
(不可重复的原因是,底层索引的储存方式是通过还是hash表储存,确保元素的唯一性,
存储过程:先通过hash()算法函数生成一个int类型hashCode散列值的,与所有hashCode比较
相同-》使用equals在进行比较,equals判断(相同不可插入,不相同直接插入)。 不相同-》直接插入 ),
初始大小16,加载因子是0.75(指的是插入的数据到达总容量的75%的时候开始扩展。扩容增量:原容量的 1 倍 如> HashSet的容量为16,一次扩容后是容量为32)
Map继承树
-
HashMap
底层数据结构是哈希表,线程不安全,效率高
HashMap集合是Map接口的一个实现类,它是线程不安全的,用于存储键值映射关系,但保证不能出现相同的键。如果有相同的键,总结一句话:键相同,值覆盖 -
Hashtable
底层数据结构是哈希表,线程安全,效率低 -
TreeMap
基于红黑二叉树的Map接口实现
a) 自然排序,无参构造方法(元素具备比较性)
i.按照compareTo()方法排序,让需要比较的元素对象所属的类实现自然排序接口Comparable,并重写compareTo()方法
b) 比较器排序,构造方法public TreeSet(Comparator comparator)(集合具备比较性)
i.让集合的构造方法接收一个比较器接口的子类对象(compareator)
(此处的Comparator为接口,需要写一个接口实现类,在实现类中重写compare()方法,并在这里创建接口实现类的对象,可以用匿名内部类来实现)
- LinkedHashMap
是Map接口的哈希表和链表列表实现,具有可预知的迭代顺序
集合的遍历
按条件删除删除注意点
最好使用iterator遍历,使用iterator内部的删除方法
Collections:
Iterator<String> it = list.iterator();
while(it.hasNext()){
String x = it.next();
while(it.hasnext()){
if(x.equals("del")){
it.remove();
}
}
Map:
Iterator<String> it = list.iterator();
while(it.hasNext()){
String x = it.next();
while(it.hasnext()){
if(x.equals("del")){
it.remove();
}
}