关于HashMap的几个问题

一、HashMap的哈希桶的初始大小是多少?

初始大小为16,并且必须为2的n次方

二、java 7 和 java 8 对于HashMap的实现有何不同?

java 7 实现方式: 数组 + 链表
java 8 实现方式: 数组 + 链表 / 红黑树(链表长度大于8)

Java 7 HashMap 存在的问题
1、并发环境下非常容易碰到死锁
2、由于hashcode算法缺陷,HashMap容易产生链表,影响性能的同时存在安全隐患
Java 8 HashMap的改进
扩容时插入顺序保持不变,防止出现环形链表,形成死循环
HashMap 扩容时的效率很低,所以在创建HashMap时就指定初始容量,避免频繁的扩容带来的性能问题,用空间换时间。

三、为什么HashMap哈希桶的大小必须为2的n次方?

在将一个元素put进一个HashMap时,需要计算其在数组中的下标,在调用该对象的hashcosd方法后算出一个int值,即为该元素的hash值,要根据该hash值来确定元素在数组中的位置,采用的算法是按位与运算: hashcode & (array.length-1) 只有桶的大小为2的幂,array.length-1得到的值二进制永远全部都是1,这样计算出来的下标分布均匀并且快速;反之,如果array.length-1得到的值二进制中存在0,做按位于运算后永远都是0,,则有些下标位置永远都会空着。

你可能感兴趣的:(关于HashMap的几个问题)