9

考虑以下 SSCCE:

public static void main(String[] args) {
    LinkedHashSet<String> set1 = new LinkedHashSet<>();
    set1.add("Bob");
    set1.add("Tom");
    set1.add("Sam");
    LinkedHashSet<String> set2 = new LinkedHashSet<>();
    set2.add("Sam");
    set2.add("Bob");
    set2.add("Tom");

    System.out.println(set1);
    System.out.println(set2);
    System.out.println(set1.equals(set2));
}

这打印:

[Bob, Tom, Sam]
[Sam, Bob, Tom]
true

但是,如果您更改LinkedHashSetLinkedList

public static void main(String[] args) {
    LinkedList<String> set1 = new LinkedList<>();
    set1.add("Bob");
    set1.add("Tom");
    set1.add("Sam");
    LinkedList<String> set2 = new LinkedList<>();
    set2.add("Sam");
    set2.add("Bob");
    set2.add("Tom");

    System.out.println(set1);
    System.out.println(set2);
    System.out.println(set1.equals(set2));
}

它产生:

[Bob, Tom, Sam]
[Sam, Bob, Tom]
false

我的问题是澄清之一。有人可以帮助理解这一点吗?为什么 aLinkedHashSet会被认为是相等的,而相同的则LinkedList不会呢?我假设定义ListSet发挥作用,但我不确定。

基本上,我的意思是,如果您认为Sets 相同,您是否也认为Lists 相同?反之亦然(假设没有重复元素)?

4

2 回答 2

13

做出的保证LinkedHashSet是关于迭代顺序的。但是,它仍然是 aSet和 set 本身并不关心顺序。List另一方面,确实如此。在第 3 位有一个元素的AList与在第 1 位有相同元素的另一个List不同。

Setequals(Object)方法的 javadoc

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

javadocLinkedHashSet状态

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。

ALinkedHashSet是一个Set。它具有相同的规则,即。适用于集合 ADT 的那些。

于 2014-04-25T20:09:51.363 回答
0

如上所述:LinkedHashSet 扩展了 HashSet,它扩展了实现 equals 方法的 AbstractSet:https ://docs.oracle.com/javase/8/docs/api/java/util/AbstractSet.html#equals-java.lang.Object-

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

如果顺序对您很重要,比较 LinkedHashSet 的最简单方法是将其序列化并进行比较:

    LinkedHashSet<Integer> reverseOrder = new LinkedHashSet<>();
    reverseOrder.add(2);
    reverseOrder.add(1);
    LinkedHashSet<Integer> ordered = new LinkedHashSet<>();
    ordered.add(1);
    ordered.add(2);
    System.out.println("Equals via set: " + ordered.equals(reverseOrder));
    System.out.println("Equals With Arrays: " + ordered.ordered.toString().equals(reverseOrder.ordered.toString()));

结果:

Equals via Set: true
Equals With Arrays: false
于 2017-03-10T00:16:34.637 回答