在Java中深度比较集合

11

我在Java中有两个集合,它们比较Item对象。是否有一种方法可以比较这两个集合,以便调用Itemequals方法而不仅仅是比较引用?

2个回答

9
每个AbstractSet的子类都实现了这个方法。请查看文档

public boolean equals(Object o)

将给定对象与此集进行比较以检查它们是否相等。当且仅当给定对象也是一个 set,两个 set 具有相同的大小并且给定 set 中的每个成员都包含在此 set 中时,才返回 true。这保证了 equals 方法能够在 Set 接口的不同实现之间正常工作。 该实现首先检查指定的对象是否为此 set;如果是,则返回 true。然后,它检查指定的对象是否为其大小与此 set 的大小相同的 set;如果不是,则返回 false。如果是,它将返回 containsAll((Collection) o)。

因此,实际上这依赖于contains实现(由containsAll(..)调用)。对于HashSet(至少是)这就是你要找的。

6

这是默认行为,如果您看到的不是这样,请检查是否同时覆盖了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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接