为什么HashMap的容量通常是2的幂次方?

2026-05-16 01:450阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1613个文字,预计阅读时间需要7分钟。

为什么HashMap的容量通常是2的幂次方?

将作为面试常考的问题之一,每次的回答都显得模糊不清,有必要深入理解一下。首先,来看一下HashMap的put方法的核心源代码:

javapublic V put(K key, V value) { if (key==null) return putForNullKey(value); // 将key进行hash运算 int hash=hash(key); int i=indexFor(hash, table.length); // 循环查找key是否存在,若存在则更新value for (Entry e=table[i]; e !=null; e=e.next) { Object k; if (e.hash==hash && ((k=e.key)==key || key.equals(k))) { V oldValue=e.value; e.value=value; e.hash=hash; return oldValue; } } // 如果key不存在,则创建新的Entry插入 modCount++; table[i]=new Entry(hash, key, value, e); if (++size > threshold) resize(); return null;}

这段代码首先检查key是否为null,如果是null,则调用`putForNullKey`方法处理。接着,对key进行hash运算,并根据hash值找到相应的数组索引。然后,在数组索引位置遍历链表,查找是否有相同的key。如果找到,则更新其value。

阅读全文

本文共计1613个文字,预计阅读时间需要7分钟。

为什么HashMap的容量通常是2的幂次方?

将作为面试常考的问题之一,每次的回答都显得模糊不清,有必要深入理解一下。首先,来看一下HashMap的put方法的核心源代码:

javapublic V put(K key, V value) { if (key==null) return putForNullKey(value); // 将key进行hash运算 int hash=hash(key); int i=indexFor(hash, table.length); // 循环查找key是否存在,若存在则更新value for (Entry e=table[i]; e !=null; e=e.next) { Object k; if (e.hash==hash && ((k=e.key)==key || key.equals(k))) { V oldValue=e.value; e.value=value; e.hash=hash; return oldValue; } } // 如果key不存在,则创建新的Entry插入 modCount++; table[i]=new Entry(hash, key, value, e); if (++size > threshold) resize(); return null;}

这段代码首先检查key是否为null,如果是null,则调用`putForNullKey`方法处理。接着,对key进行hash运算,并根据hash值找到相应的数组索引。然后,在数组索引位置遍历链表,查找是否有相同的key。如果找到,则更新其value。

阅读全文