最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
《Java高级架构知识》
《算法知识》
// 如果table的索引位置的key的hash和新加入的hash相同,并且 对象相同或者equals()比较后相同
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
// 已经树化
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
// 死循环比较,直到插入链表后停止循环
for (int binCount = 0; ; ++binCount) {
// 如果整个链表,没有和他相同,就加到该链表的最后
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
// 加入后,判断当前链表的个数,是否已经到达8个,到8个进行 treeifyBin 会判断是扩容还是树化
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
// 判断是否有相同的,如果有就break 走更新
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
// 更新操作
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value; // 替换
afterNodeAccess(e);
return oldValue;
}
}
// 每增加newNode就++
++modCount;
// 到了临界值后就扩容
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
treeifyBin
转成红黑树
final void treeifyBin(Node<K,V>[] tab, int hash) {
int n, index; Node<K,V> e;
// 如果table == null , 或者大小没有到 64,不树化,先扩容数组!
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
// 树化
else if ((e = tab[index = (n - 1) & hash]) != null) {
TreeNode<K,V> hd = null, tl = null;
do {
TreeNode<K,V> p = replacementTreeNode(e, null);
if (tl == null)
hd = p;
else {
p.prev = tl;
tl.next = p;
}
tl = p;
} while ((e = e.next) != null);
if ((tab[index] = hd) != null)
hd.treeify(tab);
}
}
1.put第1个元素时进行第一次扩容,size=16;
2.put第9个元素时进行第二次扩容,size=32,链表已经9个元素了;
3.put第10个元素时进行第三次扩容,size=64,此时已经满足树化条件了;
4.put第11个元素时进行树化,HashMap$Node => HashMap$TreeNode
import java.util.HashMap;
/** @author Strive */
@SuppressWarnings(“all”)
public class HashMapSource2 {
public static void main(String[] args) {
HashMap map = new HashMap();
for (int i = 1; i <= 12; i++) {
map.put(new A(i), “hello”);
}
System.out.println(“hashMap=” + map);
}
}
class A {
private int num;
public A(int num) {
this.num = num;
}
@Override
public int hashCode() {
return 100;
}
@Override
public String toString() {
return “\nA{” + “num=” + num + ‘}’;
}
最后
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档
祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!
感谢大家的支持!!
持!!
[外链图片转存中…(img-NtSnveUC-1715627105695)]