数据结构
# 1 数组和链表区别?
1.链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难。
3.数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
# 2 HashMap的数据结构?默认初试容量和负载因子是多少?
1.数组+链表,数组长度已扩容到64,链表长度大于8时转红黑树。
初始容量(16)和负载因子(0.75)(负载因子就是指填充到多少开始扩大容量)。
# 3 hashmap的数组长度为什么要保证是2的幂?
HashMap添加元素时,主要通过 key的hashcode值 & (容器长度 - 1)来进行位置确定。
公式:index = e.hash & (newCap - 1)
length - 1的值是所有二进制位全为1,这种情况下,index的结果等同于hashcode后几位的值。
只要输入的hashcode本身分布均匀,hash算法的结果就是均匀的。
所以,HashMap的默认长度为16,是为了降低hash碰撞的几率。
# 4 hashmap的put方法过程?
# 5 ConcurrentHashMap 1.7 与 1.8 区别?
1.JDK1.8 采用 synchronized 代替可重入锁 ReentrantLock。
2.JDK1.8 取消了 Segment 分段锁的数据结构,使用数组+链表+红黑树的结构代替。
3.JDK1.8 对每个数组元素加锁,1.7 对要操作的 Segment 数据段加锁。
Java7 ConcurrentHashMap基于ReentrantLock实现分段锁。
Java8中 ConcurrentHashMap基于分段锁+CAS保证线程安全。
分段锁基于synchronized关键字实现,只锁一个桶。
上次更新: 2022/11/24, 17:59:25