面试官Q1:为什么HashMap的长度一定是2的次幂呢?
通过前面一篇文章我们知道了,HashMap的数据结构,也知道了什么是Hash冲突,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。那么HashMap底层到底做了什么,使得Hash值散列、均匀分布呢?
以JDK1.8为例,查看下面一段代码:
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
然后再点进putVal 方法,则会看到有下面的代码:
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table)