说说HashMap原理吧?

分享
手机软件开发 2024-9-15 05:23:35 47 0 来自 中国
HashMap紧张是由数组和链表构成,它不是线程安全的。

焦点点就是put插入数据的过程,get查询数据以及扩容的方式。JDK1.7和1.8的紧张区别在于头插和尾插方式的修改,头插轻易导致HashMap链表死循环,而且1.8后参加红黑树对性能有提拔。
put插入数据流程

往map插入元素的时间,起首通过key 举行hash算法,然后与数组长度-1举行与运算((n - 1) & hash),都是2的次幂以是等同于取模,但位运算的效率更高。找到数组中的位置之后,如果数组中没有元素直接则直接存入,反之则判断key是否类似,key类似就覆盖,否则就会插入链表的尾部,如果链表的长度超过8,则会转换成红黑树,末了判断数组长度是否超过默认长度*负载因子也就是12,超过则举行扩容。
get查询数据

查询数据相对于来说就比力简朴了,起首盘算出hash值,然后去数组查询,是红黑树则去红黑树查,链表就遍历链表查询就可以了。
resize扩容过程

扩容的过程就是对key重新盘算hash,然后把数据拷贝到新的数组。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 09:58, Processed in 0.173537 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表