Java 比较两个HashMaps键是否相等?

Java 比较两个HashMaps键是否相等?,java,generics,data-structures,collections,compareto,Java,Generics,Data Structures,Collections,Compareto,我有两个HashMap,我想根据键进行比较。关键是一个HashSet,我可能需要更改为TreeSet,但我认为没有必要。我如何比较这些 注意:映射仅用作单个集合的包装器 for(HashMap<HashSet<String>, Long> entry : ListOfMaps) { if(entry.keySet().equals(entry2.keySet())) { // do something } } for(HashMap条目:

我有两个
HashMap
,我想根据键进行比较。关键是一个
HashSet
,我可能需要更改为
TreeSet
,但我认为没有必要。我如何比较这些

注意:映射仅用作单个集合的包装器

for(HashMap<HashSet<String>, Long> entry : ListOfMaps) {
    if(entry.keySet().equals(entry2.keySet())) {
        // do something
    }
}
for(HashMap条目:listofmap){
if(entry.keySet().equals(entry2.keySet())){
//做点什么
}
}
我想检查Set1.equals(Set2)

集合必须完全相同。由于每个
HashMap
中只有一个
Set
,因此抓取所有键会让我感到紧张,还是这样可以?

Set的equals()契约说:

如果给定对象也是一个集合,两个集合的大小相同,并且给定集合的每个成员都包含在此集合中,则返回true。这确保equals方法在Set接口的不同实现中正常工作

因此,只要集合实现遵循契约,代码就可以工作

但是,这可能是危险的,这取决于代码对用作键的集合所做的操作。一旦一个对象被用作映射中的键,它就不应该改变,因为这破坏了映射的契约

Map<Set<String>, T> map = HashMap<>();
Set<String> mySet = new HashSet<>();

mySet.add("first");
map.put(mySet, myValue);


Set<String> copyOfMySet = new HashSet<>(mySet);

//returns true
map.contains(copyOfMySet);

//modifying mySet
mySet.remove("first");

//this will now return false
map.contains(copyOfMySet);
Map-Map=HashMap();
Set mySet=newhashset();
mySet.add(“第一”);
map.put(mySet,myValue);
Set copyOfMySet=新哈希集(mySet);
//返回true
map.contains(copyOfMySet);
//修改mySet
mySet.remove(“第一”);
//现在将返回false
map.contains(copyOfMySet);

根据javadoc Cool的说法,您在那里得到的应该是有效的,只是确保每个集合中只有一个集合。请注意,
hashset
不是有序的,因此,
.equals()
调用将确保第一个集合中的所有字符串也出现在第二个集合中。但是它会检查每个HashSet中的所有字符串,以确保它们相等,或者只是比较顺序。Set[A,B,C]会等于Set[B,C,A]对吗?我只是使用映射作为集合和时间戳的包装。一般来说,我个人避免使用集合、列表等作为映射的键,因为很容易破坏东西。。。正如这篇评论的作者所指出的:)如果可能的话,最好使用简单的变量,如int、string等。不使用set here或任何集合的另一个原因可能是这个相等操作的复杂性。如果您使用任何字符串或int作为键,那么比较两个哈希映射将是O(nm),其中n是键长度,m是键数。现在如果您使用hashset,那么它将是O(nm*pq),其中p是Set的密钥长度,q是密钥数。如果我在这里遗漏了什么,请告诉我你的观点。