最近看了一些 java 的面经,公司都喜欢问 HashMap 的实现,我想知道,知道了实现又能如何?
这是 java1.8 的实现。
比如:1.计算数组索引时,
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
n = 2 的 k 次幂,用的是掩码取低 k 位找 index, 而不是最常用的 hash%n 找 index.
2.它的容量大小总是 2 的 k 次幂, 以配合上面的取索引。
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
3.单条链表长度大于 8 时,转换为红黑树。
//链表长度大于 8 转换为红黑树进行处理
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
4.扩容的时候不用重新计算新数组 index.只可能在原 index 的位置,或者 index * 2 的位置。
// 原索引放到 bucket 里
if (loTail != null) {
loTail.next = null;
newTab[j] = loHead;
}
// 原索引+oldCap 放到 bucket 里
if (hiTail != null) {
hiTail.next = null;
newTab[j + oldCap] = hiHead;
}
用的时候还不是假定 get 操作是 O(1)时间复杂度。 比如我在刷 leetcode 的时候,只把它当作 O(1)时间能取东西的容器,不会考虑它的扩容啊,计算索引的小技巧之类的东西。
大家学 Hash 的时候不都是看算法书,了解原理。
了解这些小技巧对平时用 HashMap 的时候会有什么帮助呢?
知道了实现真的有用吗?或者到底那些面试官想问什么呢?求大佬指教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.