2016-10-02 31 views
1
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()); 

    } 
} 

回答

1

您正在比较两个对象Collection<HashSet<Integer>>>的引用,但您想比较两个对象<HashSet<Integer>>。尝试从Collection<HashSet<Integer>>>对象中提取<HashSet<Integer>>对象,并将其与equals()方法进行比较。顺便说一句 - 将参考文献与==进行比较的结果也应该是true

+0

或者在这种情况下,*调用* equals方法。 –

1

正确比较对象数据类型的等同性是使用方法equals()

map1.equals(map2); 
+0

他想比较两个hashSet对象。的System.out.println(map1.values()等于(map2.values()));也打印错误。 –

0

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哪里键被排序。特别好:你的代码将以最广泛的类型变化来运行。

1

==告诉你两个值是否相同。 但是,map1.values()的值是而不是包含该集合的集合,而是对包含对该集合的引用的集合的引用。

因为它们是参考文献,所以map1.values() == map2.values()会告诉您map1.values()map2.values()是否指向同一个对象,但他们不这样做,因此它的计算结果为false。

您可以通过调用equals方法比较两个对象,如map1.values().equals(map2.values())