方法中的问题"转移"在HashMap(jdk 1.6)?

时间:2016-06-25 03:04:20

标签: java hashmap transfer jdk1.6

源代码是这样的:

> var list = new List<string> { "abc", "def", "xyz" };
> var x = "abcd";
> x.ContainsAny(list)
false
> x._ContainsAny(list)
true

但是我想这样做,这样做有效还是有问题? 我认为同一列表中所有元素的哈希值是相同的,所以我们不需要计算新表的buketIndex;我们唯一应该做的就是 将head元素传递给新表,这样可以节省时间。 谢谢你的回答。

void transfer(Entry[] newTable) {
    Entry[] src = table;
    int newCapacity = newTable.length;
    for (int j = 0; j < src.length; j++) {
        Entry<K,V> e = src[j];
        if (e != null) {
            src[j] = null;
            do {
                Entry<K,V> next = e.next;
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            } while (e != null);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我认为您询问的是在Java 6中实现的HashMap类,以及(特别是)您对优化内部transfer()方法的想法是否有效。

答案是肯定不会。

调整主数组时调用此transfer方法,其目的是将所有现有哈希条目传输到已调整大小的表中的正确哈希链。您的代码只是移动整个链。那不行。问题是哈希链通常包含具有多个不同哈希码的条目。虽然一组给定的条目都属于旧版本表中的同一条链,但在新版本中它们可能不会。

简而言之,您提议的修改会“丢失”某些条目,因为它们会在调整大小的表格中位于错误的位置。

这也有一个元答案。标准的Java类是由一群非常聪明的软件工程师编写和测试的。从那时起,代码可能已经被Sun / Oracle之外的数十万或其他智能人员阅读过。 其他人错过了这样一个简单/明显优化的可能性......很小。

因此,如果你在Java SE源代码中找到一些看起来像是优化(或错误)的东西,你可能会错的!