常用集合介绍

14,382 阅读1分钟

我正在参加「掘金·启航计划」

  1. 常用集合框架架构图
erDiagram
iterable ||--o{ collection : extends
collection ||--|{ List : extends
collection ||--|{ Set : extends
List ||--|{ ArrayList : implements
List ||--|{ LinkedList : implements
List ||--|{ vector : implements
Set ||--|{ Hashset : implements
Map ||--|{ hashMap : implements
Map ||--|{ hashtable : implements
  1. 底层实现:
对象数据结构默认大小线程安全
ArrayList数组10线程非安全
LinkedList双向链表线程非安全
vector数组10线程安全
hashMap数组 + 单向链表 + 红黑树(java8)16线程非安全
hashTable数组 + 单向链表11线程安全
hashSethashMap16线程非安全
sequenceDiagram

LinkedList->>ArrayList: 我虽然比你查询慢点,但是我增加删除比你快
ArrayList->>LinkedList: 反正就是我比你查询快
ArrayList->>vector: 虽然咱们其他都一样、但是我比你效率高
vector->>ArrayList: 那是因为我是线程安全,你不是安全的
sequenceDiagram

hashMap->>hashTable:hi,兄弟,我可比你效率高哦
hashTable->>hashMap:哈哈,遇见并发的时候我看你怎么办,我可是线程安全的
  1. 详细介绍

    3.1 ArrayList

    特点:有序、查询快(根据下标索引),插入慢(如果在add的时候超过当前数组大小,则每次都需要进行复制一个新的大小的数组/arrays.copyof;删除慢(每次都需要调用system.Arraycpoy) 。 线程非安全

    新建的数组大小为:旧数组(oldTable[])大小 + (oldTable>>1)

    结论:如果查多改少的情况下,并且数据量比较大,建议设置一个合理的初始大小,避免经常发生内存重分配

    3.2 Vector

    特点:与ArrayList大同小异,区别是线程安全。扩容的时候,如果在初始化的设置了每次扩容的大小(capacityIncrement),则当前大小+capacityIncrement,否则 elementData.length *2

    3.3 hashMap

    特点:线程非安全、key-value存储。默认初始大小16 每次扩容 *2 。就算在初始化的时候指定了大小,他的大小永远是16的倍数。 阀值:0.75

    3.3 hashTable

    特点:线程安全。默认初始:11。扩容:当前大小<< 1 + 1

    3.4 hashSet

    特点:底层实现使用hashMap,不允许重复,add(object),object 当成key存进map里。