在我的程序中,我有一个HashMap。它具有字符串的HashSets作为其键,并且具有String的PriorityQueues作为其值。当我更改其键之一的内容时,它不再保留为HashMap的成员。这对我来说似乎很奇怪,因为我没有更改密钥的引用。我只是更改其内容。请查看以下代码段:

HashMap<HashSet<String>, PriorityQueue<String>> myHashMap=new HashMap<>();

HashSet<String> myHashSet=new HashSet<>();
myHashSet.add("abc");
myHashSet.add("mnq");
myHashSet.add("al;ksghl");

PriorityQueue<String> myPriorityQueue=new PriorityQueue<>();
myPriorityQueue.add("3h4");
myPriorityQueue.add("lskdjf");

myHashMap.put(myHashSet, myPriorityQueue);

if(myHashMap.containsKey(myHashSet))
    System.out.println("Yes!");

myHashSet.remove("abc");

if(myHashMap.containsKey(myHashSet))
    System.out.println("Yes!");


基本上,我希望看到两个“是!”,实际上,它只打印一个。我进行了彻底的调试,并意识到myHashSet的引用号在删除其中一个成员后不会更改。因此,该程序没有理由不打印第二个“是!”。

任何帮助都非常感谢。

最佳答案

Hashmap键取消了键的哈希值/等号(已指出,此值正在更改)。如果您关心身份,则应使用java.util.IdentityHashMap

09-04 09:11