我正在参加「掘金·启航计划」
- 常用集合框架架构图
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
- 底层实现:
| 对象 | 数据结构 | 默认大小 | 线程安全 |
|---|---|---|---|
| ArrayList | 数组 | 10 | 线程非安全 |
| LinkedList | 双向链表 | 线程非安全 | |
| vector | 数组 | 10 | 线程安全 |
| hashMap | 数组 + 单向链表 + 红黑树(java8) | 16 | 线程非安全 |
| hashTable | 数组 + 单向链表 | 11 | 线程安全 |
| hashSet | hashMap | 16 | 线程非安全 |
sequenceDiagram
LinkedList->>ArrayList: 我虽然比你查询慢点,但是我增加删除比你快
ArrayList->>LinkedList: 反正就是我比你查询快
ArrayList->>vector: 虽然咱们其他都一样、但是我比你效率高
vector->>ArrayList: 那是因为我是线程安全,你不是安全的
sequenceDiagram
hashMap->>hashTable:hi,兄弟,我可比你效率高哦
hashTable->>hashMap:哈哈,遇见并发的时候我看你怎么办,我可是线程安全的
-
详细介绍
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里。