Java集合
Java集合概述
一、List、Set、Map之间的关系
-
List 存储的元素是有序的,可以重复的
-
Set 存储的元素是无序的,不可重复的
-
Map 存储的元素是键值对
key是无序的,不可重复的
value是无序的,可以重复的
二、 HashMap:
- jdk1.8之前是数组加链表的形式来存储,数组是HashMap的主体,链表是为了解决Hash冲突问题的。
- jdk1.8之后采用的就是数据+链表+红黑树的形式了,当链表的长度大于8的时候就会转化为红黑树的形式存储(在转化之前,要对数组的长度是不是小于64,否则就需要堆数组先进行扩容再进行红黑树的转换),转换成红黑树的原因是因为,随着链表的长度越来越长,红黑树会减少搜索时间。
三、LinkedList和ArrayList的区别
- 线程安全上:都是不安全的,底层没有实现同步方法
- 数据结构上:一个是采用数组的形式存储的,一个使用的是双向链表
- 快速查找:数据结构决定了不同的功能,前者是个插入和删除操作,不适合快速查找,数组结构适合查找,不适合删除和插入操作
四、ArrayList的扩容机制
- 以无参构造ArrayList的时候会创建一个空的数组(由于jvm在创建一个新的对象时会对对象赋0值导致的),然后添加第一个元素的时候,会变成10的的数组容量。
- 当发生扩容时遵循
int newCapacity = oldCapacity + (oldCapacity>>1)
所以要是原来的容量是奇数的话,扩容之后就是1.5倍左右
五、为什么HashMap的长度是2的n次幂
- 确定位置的时候使用的(n-1)&hash相当于就是除以2的操作
六、 ConcurrentHashMap的线程安全的实现方式
-
1.7之前采用的是分段锁技术,每一段数据就是一个segment,默认是16个,每一个segment分配一把锁,这样不同的线程访问不同的segment可以提高并发度。
-
1.8之后,取消了segmrnt的分段式锁的结构,Synchronized做了一定的优化,使用Synchronized+CSA乐观锁的机制来保证并发度。采用和HashMap一样的底层存储结构,使用的是数组+红黑树的方式,数组是数据储存的主体,链表是为了解决Hash冲突问题。
使用Synchronized只锁住当前链表或者是红黑二叉树的头结点
参考文章:java guide