import java.util.*;
public class Solution {
public static void main(String[] args) {
HashMap<Integer, HashSet<Integer>>
map1 = new HashMap<Integer, HashSet<Integer>>(),
map2 = new HashMap<Integer, HashSet<Integer>>();
HashSet<Integer> set1=new HashSet<Integer>();
set1.add(1);
set1.add(2);
map1.put(1,set1);
map2.put(1,set1);
System.out.println(map1.values()==map2.values());
System.out.println(map1.values()+" "+map2.values());
}
}
回答
您正在比较两个对象Collection<HashSet<Integer>>>
的引用,但您想比较两个对象<HashSet<Integer>>
。尝试从Collection<HashSet<Integer>>>
对象中提取<HashSet<Integer>>
对象,并将其与equals()
方法进行比较。顺便说一句 - 将参考文献与==
进行比较的结果也应该是true
。
正确比较对象数据类型的等同性是使用方法equals()
。
map1.equals(map2);
他想比较两个hashSet对象。的System.out.println(map1.values()等于(map2.values()));也打印错误。 –
map1和map2都创建了自己的values
列表。这两个列表在您的案例中都有一个单一的元素,这与==
相同。如果你会使用equals
,那么两个列表都是相等的。 ==
测试对象相等/身份。
顺便说一句,在Java中的约定是:
Map<Integer, Set<Integer>> map1 = new HashMap<>();
Map<Integer, Set<Integer>> map2 = new HashMap<>();
Set<Integer> set1 = new HashSet<>();
对于使用接口(地图,设定)为变量的存在理由:作为这样一个可能会改变实现,例如以一个TreeMap哪里键被排序。特别好:你的代码将以最广泛的类型变化来运行。
==
告诉你两个值是否相同。 但是,map1.values()
的值是而不是包含该集合的集合,而是对包含对该集合的引用的集合的引用。
因为它们是参考文献,所以map1.values() == map2.values()
会告诉您map1.values()
和map2.values()
是否指向同一个对象,但他们不这样做,因此它的计算结果为false。
您可以通过调用equals
方法比较两个对象,如map1.values().equals(map2.values())
。
或者在这种情况下,*调用* equals方法。 –