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呢?我假设定义List并Set发挥作用,但我不确定.
基本上,我说如果你认为Sets是相同的,你会不会认为Lists也是一样的?反之亦然(假设没有重复的元素)?
Sot*_*lis 11
LinkedHashSet所做的保证是关于迭代顺序.然而,它仍然是一个Set和一套不关心秩序本身.一个List在另一方面,确实.List具有第三位置的元素的A 与具有List第一位置的相同元素的另一元素不同.
Setequals(Object)方法的javadoc
如果指定的对象也是一个集合,则返回true,两个集合具有相同的大小,并且指定集合的每个成员都包含在此集合中(或者等效地,此集合的每个成员都包含在指定的集合中).此定义确保equals方法在set接口的不同实现中正常工作.
该LinkedHashSetjavadoc的状态
Set接口的哈希表和链表实现,具有可预测的迭代顺序.
A LinkedHashSet是一个Set.它有相同的规则,即.适用于ADT的那些.