集合数据结构总结

215 阅读2分钟

 List

 有序集合

ArrayList

结构:采用数组结构,查询性能优秀(数组将元素在内存中连续存放,链表非顺序存放),插入以及删除性能较差(插入以及删除都会设计到目标元素后的元素位置移动,而链表只需要修改指向下标)

扩容:

  1. 创建一个容量为原数组容量1.5倍的新数组,并将原数组复制到新数组
  2. 新添加元素插入到新数组最后一位
  3. 原数组被GC处理

ArrayList与数组的区别?

  1. 数组需要指定长度,ArrayList不用,默认10
  2. ArrayList可以动态扩容,1.5倍

LinkedList

结构:采用双链表结构,插入删除性能优秀

无需扩容

Vector

线程安全,扩容时增加一倍

Set

无序集合,用于排重

TreeSet

支持自然顺序访问,插入删除性能低效

HashSet

利用哈希算法,插入删除性能优秀,不保证有序

LinkedHashSet

内部维护一个记录插入顺序的双向链表,所以既保证有序,又保证插入删除的性能,但是性能低于HashSet,因为维护链表有额外开销

Queue

队列结构,先入先出、后入后出,有优先级队列,可用于优先级处理场景

Map

HashMap

结构:采用数组+链表的数据结构,在jdk 1.8中,当链表长度超过8改变结构为红黑树

特性:put时,根据hash函数(key的hash值 异或 (数组长度-1))得到数组下标,确定放入某一个桶中,当桶中有元素时,根据equals挨个判断是否存在相同key值,存在的话则覆盖,不存在则新增

高并发情况下,jdk 1.7 hashmap会出现环形链表死循环情况,1.8采用头插法解决

支持null键值

扩容:与数组一样,扩容时创建新数组,然后将元素重新进行hash排序

HashTable

本身同步,不支持null键值

TreeMap

基于红黑树提供顺序访问

LinkHashMap

与hashmap类似,内部额外提供双向链表,提供顺序访问