2 集合

集合类的关键点?

  1. 是否允许空值 2. 是否有序 3. 是否允许重复 4. 是否线程安全

ArrayList

  1. ArrayList的特点是什么?
    允许空值,有序,可以重复,非线程安全
    底层由数组实现,可以方便的进行数据访问;如果要进行数据插入或者删除,则会通过arrayCopy进行数据的移动,所以查找访问效率高,添加删除效率低,顺序添加不需要更改其他数据位置,所以效率也很高。
    扩容操作 (size*3)/2 + 1 扩容1.5倍 数组默认大小为10
  2. ArrayList和Vector有什么区别?
    Vector是线程安全的,在扩容时Vector可以指定扩容因子,默认2倍扩容

LinkedList

  1. LinkedList的特点是什么?
    允许空值,有序,可以重复,非线程安全
    是一个双向链表,链表中的任一节点都可以向前或者向后查找到相邻的节点,链表表头的前一个节点是表尾,表尾的后一个节点是表头
    查找元素,如果index
  2. LinkedLIst和ArrayList的对比
    顺序插入ArrayList会快一点;LinkedList由于每个节点都附带前后节点的信息,所以更耗费内存;LinkedList寻址慢,插入删除快,ArrayList寻址快,插入删除需要复制数据所以较慢

CopyOnWriteArrayList

  1. CopyOnWriteArrayList的特点是什么?
    允许空值,有序,可以重复,线程安全
    底层为数组, 可变的操作都伴随着复制操作
    添加操作的流程,加锁 --> 创建一个新数组size+1 --> 复制原来的数据 --> 填入新数据 --> 引用指向新数组 --> 解锁
    读写分离,最终一致

HashMap

  1. HashMap的特点是什么?
    允许空值,无序,key重复会覆盖,value可以重复,非线程安全
    存储key-value键值对
  2. 底层的存储结构是什么样的?
    数组+链表+红黑树
  3. 扩容的流程是怎么的?
    初始容量为2的整数次幂,如果指定的大小不是2的整数次幂,则选取大于给定数值的最小2的整数次幂
    扩容阀值为size*factory容载因子
    扩容后需要重新计算entry在map中的位置
  4. 怎么保证数据的均匀分布?
    hash方法会根据key的hashcode重新计算hash值,然后根据hash值得到在map中的位置
  5. hashcode 和 equal
    hashcode相等,equal不一定相等,但equal相等hashcode一定相等
    在查找或者删除时,会优先比较hash值提高效率

LinkedHashMap

  1. LinkedHashMap的特点是什么?
    允许空值,有序,key重复会覆盖,value可以重复,非线程安全
    基本存储结构和HashMap相同,数组+链表+红黑树,存储的entry继承子HashMap.Entry,多了两个变量befor和after形成双向链表,记录entry的插入/访问顺序,因此相较于HashMap的添加和删除多了维护双向链表的操作,可以通过设置accessOrder来选择是否根据访问排序
  2. 和HashMap的区别是什么?
    双向链表,插入排序或者访问排序
  3. 如何保证数据有序排列?
    accessOrder参数设置,在访问数据的时候会调用recordAccess(this)方法;如果根据访问排序,entry断开原来的链接(before、after),插入到header之前(通过调整before和after);如果插入排序,则entry直接插入到header之前就可以了

HashSet

底层就是一个HashMap,用key来存储对象保证数据的不重复

LinkedHashSet

底层是一个LinkedHashMap,LinkedHashSet和HashSet之间的关系 同 LinkedHashMap和HashMap之间的关系

参考博客地址

你可能感兴趣的:(2 集合)