繁体   English   中英

Java中的深度比较集

[英]Deep compare sets in Java

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

AbstractSet每个子AbstractSet这样做的。 查看文档

public boolean equals(Object o)

将指定对象与此set进行相等性比较。 如果给定对象也是一个集合,则返回true,两个集合具有相同的大小,并且给定集合的每个成员都包含在此集合中。 这可确保equals方法在Set接口的不同实现中正常工作。 此实现首先检查指定的对象是否为此set; 如果是这样,它返回true。 然后,它检查指定的对象是否是一个大小与该集合的大小相同的集合; 如果没有,则返回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);
    }
} 

这输出:

真正

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM