面试题:blog.csdn.net/ThinkWon/ar…
ArrayList
底层数组,但是会动态增长、只存数据,不存地址,逻辑顺序和物理顺序一致。
优点:按照索引查询效率高
缺点:删除效率低
底层
- jdk1.7初始化容量为10,1.8初始化为0,在第一次添加元素的时候进行扩容
- 当容量满时会进行扩容,默认每次扩容为1.5倍
LinkedList
双向链表,不连续的空间,不仅存数据,还存地址,逻辑顺序和物理顺序不一致。
优缺点与ArrayList相反
ArrayList与LinkedList谁更浪费空间?
都浪费,ArrayList创建固定空间,但不一定使用到那么多空间;LinkedList虽然使用多少创建多少,但是既要数据又要地址。
HashMap
哈希表,key-value结构
底层
-
1.7 是数组加链表,1.8是链表大于8之后链表为红黑树,目的是减少比较次数,提高效率
-
链表上的每个节点就是一个Entry
- hash哈希码
- key键
- value值
- next指向下一个Entry节点
-
默认长度16
-
默认装填因子0.75(元素个数达到主数组长度的75%时扩容)
-
扩容为原来的2倍,new一个新的数组,将老的数组中的数据一个个的转移,不是复制
- jdk1.7扩容后链表中的数据顺序相反
- 1.8扩容不会发生改变
-
发生hash冲突,经过比较不存在相同的key元素,要添加一个新的节点。1.7不是添加在链表最后,而且最前;1.8是插在链表的尾部
-
HashSet底层就是HashMap,HashSet为HashMap的key,value为new Object()
ConcurrentHashMap
1.7
-
Segment数组
-
Segment:是一个对象,类似于一个小的HashMap
-
并发级别:代表着一个Segment管理着几个HashMap数组
1.8
- 对每个数组的头节点进行锁
- 扩容中的转移数据时,会有一个标记,当另一线程进入时发现标记后则会帮助扩容线程进行扩容