我在Java中有两组比较Item
个对象。是否有方法来比较集合,以便调用Item
的{{1}}方法,而不仅仅是比较引用?
答案 0 :(得分:9)
AbstractSet
的每个孩子都这样做。见the docs
public boolean equals(Object o)
将指定对象与此集进行相等性比较。如果给定对象也是一个集合,则返回true,两个集合具有相同的大小,并且给定集合的每个成员都包含在此集合中。这可确保equals方法在Set接口的不同实现中正常工作。 此实现首先检查指定的对象是否为此set;如果是这样,它返回true。然后,它检查指定的对象是否是一个大小与该集合的大小相同的集合;如果没有,则返回false。如果是,则返回containsAll((Collection)o)。
所以实际上这依赖于contains
实现(由containsAll(..)
调用)。对于HashSet
(至少),这就是您要寻找的。 p>
答案 1 :(得分: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);
}
}
输出:
真