【问题标题】:Deep compare sets in JavaJava中的深度比较集
【发布时间】:2011-05-27 21:07:47
【问题描述】:

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

【问题讨论】:

    标签: java collections


    【解决方案1】:

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

    public boolean equals(Object o)

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

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

    【讨论】:

      【解决方案2】:

      这是默认行为,如果不是您所看到的,请检查您是否也覆盖了 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);
          }
      } 
      

      这个输出:

      是的

      【讨论】:

      • 谢谢@MrWiggles。覆盖 hashCode 解决了我的问题(覆盖 hashCode 和 equals 之一不起作用)。
      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多