【问题标题】:Comapring Objects of TreeSet and HashSet [duplicate]比较 TreeSet 和 HashSet 的对象
【发布时间】:2023-03-25 12:17:01
【问题描述】:
List<String> list = Arrays.asList("Snehal", "Masne", "Anything", "Else");

HashSet<String> hashSet = new HashSet<String>(list);
TreeSet<String> treeSet = new TreeSet<String>(list);

System.out.println("Equality  = " + hashSet.equals(treeSet));  // returns True

equals() 如何通过比较 diff 结构来评估结果?怎么会成真?只是比较哈希码吗?如果是,怎么会一样?

【问题讨论】:

  • "Is just Hashcode 被比较" 不。根据定义,哈希码不是也不应该用于测试相等性。哈希码在有限空间(32 位)和hash collisions are possible 内。
  • @Michael nitpick:在这种情况下,由于HashSet 是基于HashMap,hashCode 将被调用。
  • @Eugene 当然你是对的,它被称为。但仅此还不足以保证相等,任何匹配的元素散列之后都会调用equals。抱歉,如果不清楚。
  • @Michael 正如我在回答中所说的那样......

标签: java set equals


【解决方案1】:

Set的Javadoc有答案:

boolean java.util.Set.equals(Object o)

比较指定对象与此集合是否相等。如果指定对象也是一个集合,则返回 true,这两个集合具有相同的大小,并且指定集合的​​每个成员都包含在此集合中(或等效地,此集合的每个成员都包含在指定集合中)。 此定义确保 equals 方法在 set 接口的不同实现中正常工作

只要两个Set具有完全相同的元素,它们是否具有Set接口的不同实现都没关系。

【讨论】:

    【解决方案2】:

    AbstractSet#equals 下方调用containsAll。对于每个元素,此方法检查它是否存在于另一个 Set

    public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))
                return false;
        return true;
    }
    

    这将调用HashSet#contains,如下所示:

    public boolean contains(Object o) {
        return map.containsKey(o);
    }
    

    请注意,由于HashSet 只不过是一个带有虚拟值的HashMap - hashCode 确实被调用,但只是为了找到它可能所在的桶 - 比较仍在使用 equals

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多