2010-12-19 33 views

回答

9

AbstractSet的每个孩子都这样做。见the docs

public boolean equals(Object o)

比较指定对象与此set的相等。如果给定对象也是一个集合,则返回true,这两个集合具有相同的大小,并且给定集合中的每个成员都包含在此集合中。这确保了equals方法在Set接口的不同实现中正常工作。 这个实现首先检查指定的对象是否是这个集合;如果是的话,它返回true。然后,它检查指定的对象是否与其集合的大小相同;如果不是,则返回false。如果是这样,它返回containsAll((Collection)o)。

所以实际上这依赖于contains实现(由containsAll(..)调用)。对于HashSet(至少)这是你正在寻找。

4

这是默认行为,如果它不是你所看到的,那么检查你是否重写了hashCode。参见下面的代码中的示例:

public static void main(String[] args) { 
    Set<Item> items1 = new HashSet<Item>(); 
    items1.add(new Item("item 1")); 
    items1.add(new Item("item 2")); 

    Set<Item> items2 = new HashSet<Item>(); 
    items2.add(new Item("item 1")); 
    items2.add(new Item("item 2")); 

    System.out.println(items1.equals(items2)); 
} 

private static class Item { 
    private String id; 

    public Item(String id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     return id.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return id.equals(((Item)obj).id); 
    } 
} 

此输出:

+1

由于@MrWiggles。重写hashCode解决了我的问题(重写hashCode和equals中的任何一个都不起作用)。 – user495285 2014-02-26 16:03:30