最全HashMap底层结构和源码分析,Java开发指南

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

n = (tab = resize()).length;

// 取出hash值对应的table的索引位置的Node,如果为null,就直接把加入的K-V创建newNode放入

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newNode(hash, key, value, null);

else {

Node<K,V> e; K k;

// 如果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;

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[外链图片转存中…(img-mFtaUbJc-1715555037744)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值