gpt4 book ai didi

java - HashMap 关键问题

转载 作者:行者123 更新时间:2023-11-30 07:37:01 25 4
gpt4 key购买 nike

我正在分析一些旧的 Java 代码,我使用静态 HashMap 和访问方法的值缓存似乎不起作用。

缓存代码(有点抽象):

static HashMap<Key, Value> cache = new HashMap<Key, Value>();

public static Value getValue(Key key){
System.out.println("cache size="+ cache.size());
if (cache.containsKey(key)) {
System.out.println("cache hit");
return cache.get(key);
} else {
System.out.println("no cache hit");
Value value = calcValue();
cache.put(key, value);
return value;
}
}

分析代码:

for (int i = 0; i < 100; i++)
{
getValue(new Key());
}

结果输出:

 cache size=0
no cache hit
(..)
cache size=99
no cache hit

这看起来像是 Key 的哈希码或等价码中的标准错误。然而:

 new Key().hashcode == new Key().hashcode // TRUE
new Key().equals(new Key()) // TRUE

特别奇怪的是 cache.put(key, value) 只是将另一个值添加到 hashmap,而不是替换当前值。

所以,我真的不明白这里发生了什么。我做错了什么吗?

编辑好的,我看到在实际代码中 Key 被用于其他方法和更改,因此反射(reflect)在 HashMap< 中对象的 hashCode。这可能是这种行为的原因,它消失了吗?

最佳答案

equals/hashCode 的适当的 @Override

我不相信你 @Override(你正在使用注释,对吧?) hashCode/equals 正确。如果您没有使用 @Override,您可能已经定义了 int hashcode()boolean equals(Key),这两者都不会做要求的事。


关键突变

如果您正在改变 map 的键,那么是的,麻烦会接踵而至。来自 the documentation :

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

这是一个例子:

Map<List<Integer>,String> map =
new HashMap<List<Integer>,String>();
List<Integer> theOneKey = new ArrayList<Integer>();
map.put(theOneKey, "theOneValue");

System.out.println(map.containsKey(theOneKey)); // prints "true"
theOneKey.add(42);
System.out.println(map.containsKey(theOneKey)); // prints "false"

顺便说一下,在类型声明中,接口(interface)优先于实现类。这是来自 Effective Java 2nd Edition 的引述:第 52 条:通过接口(interface)引用对象

[...] you should favor the use of interfaces rather than classes to refer to objects. If appropriate interface types exist, then parameters, return values, variables, and fields should all be declared using interface types.

在这种情况下,如果可能的话,您应该将 cache 声明为简单的 Map 而不是 HashMap

关于java - HashMap 关键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com