我在Java中有两个集合,它们比较Item
对象。是否有一种方法可以比较这两个集合,以便调用Item
的equals
方法而不仅仅是比较引用?
我在Java中有两个集合,它们比较Item
对象。是否有一种方法可以比较这两个集合,以便调用Item
的equals
方法而不仅仅是比较引用?
AbstractSet
的子类都实现了这个方法。请查看文档
因此,实际上这依赖于
public boolean equals(Object o)
将给定对象与此集进行比较以检查它们是否相等。当且仅当给定对象也是一个 set,两个 set 具有相同的大小并且给定 set 中的每个成员都包含在此 set 中时,才返回 true。这保证了 equals 方法能够在 Set 接口的不同实现之间正常工作。 该实现首先检查指定的对象是否为此 set;如果是,则返回 true。然后,它检查指定的对象是否为其大小与此 set 的大小相同的 set;如果不是,则返回 false。如果是,它将返回 containsAll((Collection) o)。
contains
实现(由containsAll(..)
调用)。对于HashSet
(至少是)这就是你要找的。这是默认行为,如果您看到的不是这样,请检查是否同时覆盖了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);
}
}
真