对table[1]中的链表来说,进入while循环,此时e=key(3),那么next=key(7),经过计算重新定位e=key(3)在新表中的位置,并把e=key(3)挂在newTable[3]的位置
这样循环下去,将table[1]中的链表循环完成后,于是HashMap就完成了扩容
并发下的扩容
上面都是单线程下的扩容,当多线程进行扩容时,会是什么样子呢?
初始的HashMap还是:
我们现在假设有两个线程并发操作,都进入了扩容操作, 我们以颜色进行区分两个线程。
回顾我们的扩容代码,我们假设,线程1执行到Entry<K,V> next = e.next;时被操作系统调度挂起了,而线程2执行完成了扩容操作
于是,在线程1,2看来,就应该是这个样子
接下来,线程1被调度回来执行:
1)
2)
3)
4)
5)
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)
网盘:pan.baidu.com/s/1MtPP4d9Xy3qb7zrF4N8Qpg
提取码:2p8n
**
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
mg-He4nIAtc-1631364980823)]
[外链图片转存中…(img-nmeWMUaj-1631364980824)]
[外链图片转存中…(img-zuQYeKI9-1631364980825)]