Comapring TreeSet和HashSet的对象

时间:2017-12-05 10:31:56

标签: java set equals

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结构来评估结果?怎么来的呢?只是比较Hashcode?如果是这样,怎么会一样呢?

2 个答案:

答案 0 :(得分:3)

Set的Javadoc有答案:

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

  

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

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

答案 1 :(得分:1)

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