gpt4 book ai didi

java - 为什么我的 HashMap 有重复的键?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:25 24 4
gpt4 key购买 nike

我们有一个名为 Subscriber 的类,它扩展了“HashMap”。我们在一个列表中有很多这个类的实例,每个实例都有一组条目设置到 map ,其中一个是“状态”。

我们的程序通过调用订阅服务器上的一个方法来更新“状态”值,该方法对 HashMap 执行简单的 put。

我们的程序可以运行数天(数周)而不会出现任何问题,但有时我们会在系统的其他部分看到奇怪的行为,这些部分使用来自 HashMap 的数据。对于我们来说,一个或多个订阅者实例中似乎存在重复键。

我们设法创建了一个 jmap 转储,当我在 VisualVM 中查看转储时,它会根据转储查找我们设置了两次“状态”。

Screenshot of VisualVM

我们目前运行的 Java 版本:1.7.0_25 (Oracle)

这怎么可能?还是我读错了 VisualVM?

最佳答案

除了线程问题之外,还有一条通往此结果的明确途径:

class Key implements CharSequence {

private byte[] key;

public Key(String key) {
// Take a copy of the bytes of the string.
this.key = key.getBytes();
}

@Override
public int length() {
return key.length;
}

@Override
public char charAt(int index) {
return (char) key[index];
}

@Override
public CharSequence subSequence(int start, int end) {
return new Key(new String(key).substring(start, end));
}

// Allow the key to change.
public void setKey(String newValue) {
key = newValue.getBytes();
}

@Override
public String toString() {
return new String(key);
}
}

public void test() {
Map<CharSequence, String> testMap = new HashMap<>();
Key aKey = new Key("a");
Key bKey = new Key("b");
testMap.put(aKey, "a");
testMap.put(bKey, "b");
bKey.setKey("a");
System.out.println(testMap.keySet());
}

这实质上是使 map 的键可变,因此可以在将它们添加到 map 后更改它们。

尽管这可能不是您面临的问题(更有可能是多线程问题),但这是对How come my HashMap have a duplicate key? 这个问题的真正答案。

关于java - 为什么我的 HashMap 有重复的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27104259/

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