#集合(基于JDK1.8)
##Map
以键值对形式存储数据。
- 1.1 HashMap
- 底层结构:数组+单向链表+红黑树(jdk1.8之后)
- 底层数组默认初始化容量:16
- 底层数组最大容量:2的30次方
- 单向链表转红黑树阈值:8
- 红黑树转单向链表阈值:6
- 默认加载因子:0.75(每次扩容增加两倍)
- 底层数组扩容时相当耗费性能
- 非线程安全,性能高,允许键值对为null(key=null时候,值存储在数组第一个位置arr[0]);modCount代表该对象被修改次数,迭代器初始化时候将modCount赋值给expectedModCount,迭代时候判断这两个值如果不等表示已被其他线程修改,并抛出异常。
- HashMap在底层通过Node[]来保存键值对,保存键值对时通过key的hash值决定其在数组中的位置,equals方法决定其在链表中的存储位置;获取value值过程同上。
- 1.2 TreeMap
- 有序集合,通过红黑树实现。
- 在进行网络通讯加签之前可以用到该类。
- 1.3 HashTable
- 底层实现与HashMap相同
- 线程安全,因其方法用synchronized修饰,性能低,因此催生ConCurrentHashMap的出现。
- 1.4 LinkedHashMap
- 与HashMap实现原理相似,区别在于LinkedHashMap维护了一个双向循环链表,实现了有序。
- 1.5 ConCurrentHashMap
- 线程安全,保证性能
- 对底层数组分段加锁和读写锁:读锁所有线程共享;写锁排他,只允许一个线程进行写操作
##List
- 1.1 ArrayList
- 底层结构:数组
- 默认初始化容量:10
- 特点:查询效率高,有序,可重复
- 扩容机制
当调用集合的add()方法时候,先扩容,新数组长度是旧数组长度的1.5倍,然后将旧数组的内容复制到新数组,再将新数据放到新集合最后一个位置。
- 1.2 LinkedList
- 底层由双向链表进行维护。
- 增删效率高
- 每一个节点包含指向前、后节点的地址,以及存储当前数据的引用
- 1.3 Vector
- 底层由数组实现的List
- 其部分方法经synchronized修饰,可以保证线程安全,但是效率低
##Set
Set的三个主要实现类均非线程安全,需调用Collections工具类方法保证线程安全。
- 1.1 HashSet
- 底层由HashMap实现,无序,不可重复;根据Map特性,所谓不许重复其实是在调用add()方法后,相同键被新键值覆盖。
- 1.2 LinkedHashSet
- LinkedHashSet是HashSet的一个子类,底层由LinkedHashMap实现。
- 1.3 TreeSet
- 底层由TreeMap类实现,通过红黑树实现数据的有序。如果没有排序需求,使用其他两个实现类性能更好。
ConCurrentHashMap和队列深入了解,下回分解……