2 集合
2018-01-17 本文已影响0人
江东独步行
集合类的关键点?
- 是否允许空值 2. 是否有序 3. 是否允许重复 4. 是否线程安全
ArrayList
- ArrayList的特点是什么?
允许空值,有序,可以重复,非线程安全
底层由数组实现,可以方便的进行数据访问;如果要进行数据插入或者删除,则会通过arrayCopy进行数据的移动,所以查找访问效率高,添加删除效率低,顺序添加不需要更改其他数据位置,所以效率也很高。
扩容操作 (size*3)/2 + 1 扩容1.5倍 数组默认大小为10 - ArrayList和Vector有什么区别?
Vector是线程安全的,在扩容时Vector可以指定扩容因子,默认2倍扩容
LinkedList
- LinkedList的特点是什么?
允许空值,有序,可以重复,非线程安全
是一个双向链表,链表中的任一节点都可以向前或者向后查找到相邻的节点,链表表头的前一个节点是表尾,表尾的后一个节点是表头
查找元素,如果index<size/2 向后查找,否则向前查找(双向链表) - LinkedLIst和ArrayList的对比
顺序插入ArrayList会快一点;LinkedList由于每个节点都附带前后节点的信息,所以更耗费内存;LinkedList寻址慢,插入删除快,ArrayList寻址快,插入删除需要复制数据所以较慢
CopyOnWriteArrayList
- CopyOnWriteArrayList的特点是什么?
允许空值,有序,可以重复,线程安全
底层为数组, 可变的操作都伴随着复制操作
添加操作的流程,加锁 --> 创建一个新数组size+1 --> 复制原来的数据 --> 填入新数据 --> 引用指向新数组 --> 解锁
读写分离,最终一致
HashMap
- HashMap的特点是什么?
允许空值,无序,key重复会覆盖,value可以重复,非线程安全
存储key-value键值对 - 底层的存储结构是什么样的?
数组+链表+红黑树 - 扩容的流程是怎么的?
初始容量为2的整数次幂,如果指定的大小不是2的整数次幂,则选取大于给定数值的最小2的整数次幂
扩容阀值为size*factory容载因子
扩容后需要重新计算entry在map中的位置 - 怎么保证数据的均匀分布?
hash方法会根据key的hashcode重新计算hash值,然后根据hash值得到在map中的位置 - hashcode 和 equal
hashcode相等,equal不一定相等,但equal相等hashcode一定相等
在查找或者删除时,会优先比较hash值提高效率
LinkedHashMap
- LinkedHashMap的特点是什么?
允许空值,有序,key重复会覆盖,value可以重复,非线程安全
基本存储结构和HashMap相同,数组+链表+红黑树,存储的entry继承子HashMap.Entry,多了两个变量befor和after形成双向链表,记录entry的插入/访问顺序,因此相较于HashMap的添加和删除多了维护双向链表的操作,可以通过设置accessOrder来选择是否根据访问排序 - 和HashMap的区别是什么?
双向链表,插入排序或者访问排序 - 如何保证数据有序排列?
accessOrder参数设置,在访问数据的时候会调用recordAccess(this)方法;如果根据访问排序,entry断开原来的链接(before、after),插入到header之前(通过调整before和after);如果插入排序,则entry直接插入到header之前就可以了
HashSet
底层就是一个HashMap,用key来存储对象保证数据的不重复
LinkedHashSet
底层是一个LinkedHashMap,LinkedHashSet和HashSet之间的关系 同 LinkedHashMap和HashMap之间的关系