LinkedHashSet .equals()vs LinkedList .equals()具有相同的元素但顺序不同

ryv*_*age 8 java collections linked-list equals linkedhashset

考虑以下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));
}
Run Code Online (Sandbox Code Playgroud)

这打印:

[Bob, Tom, Sam]
[Sam, Bob, Tom]
true
Run Code Online (Sandbox Code Playgroud)

然而,如果你LinkedHashSet改为LinkedList:

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));
}
Run Code Online (Sandbox Code Playgroud)

它产生:

[Bob, Tom, Sam]
[Sam, Bob, Tom]
false
Run Code Online (Sandbox Code Playgroud)

我的问题是澄清.有人可以帮助理解这个吗?为什么一个LinkedHashSet被认为是平等的,而同样的LinkedList呢?我假设定义ListSet发挥作用,但我不确定.

基本上,我说如果你认为Sets是相同的,你会不会认为Lists也是一样的?反之亦然(假设没有重复的元素)?

Sot*_*lis 11

LinkedHashSet所做的保证是关于迭代顺序.然而,它仍然是一个Set和一套不关心秩序本身.一个List在另一方面,确实.List具有第三位置的元素的A 与具有List第一位置的相同元素的另一元素不同.

Setequals(Object)方法的javadoc

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

LinkedHashSetjavadoc的状态

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

A LinkedHashSet是一个Set.它有相同的规则,即.适用于ADT的那些.

  • @ryvantage这些类旨在实现[ADTs](http://en.wikipedia.org/wiki/Abstract_data_type).集合就是这样一种数据结构.它被定义为一个抽象的数据结构,可以存储某些值,没有任何特定的顺序,也没有重复的值.换句话说,顺序对集合并不重要.`LinkedHashSet`中的顺序只对程序员很重要,但不会影响设置数据结构的定义. (2认同)