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



考虑以下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

但是,如果将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));
}

它产生:

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

我的问题是澄清问题。有人能解释一下吗?为什么一个LinkedHashSet会被认为是相等的,而相同的LinkedList却不会?我假设ListSet的定义起作用,但我不确定。

基本上,我的意思是,如果你认为Set s是相同的,你不认为List s也是相同的吗?反之亦然(假设没有重复元素)?

LinkedHashSet所做的保证是关于迭代顺序的。然而,它仍然是一个Set,集合本身并不关心顺序。另一方面,List确实如此。元素位于第三位置的CCD_ 12与元素位于第一位置的另一CCD_ 13不同。

Set用于equals(Object)方法的javadoc

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

LinkedHashSet javadoc声明

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

CCD_ 17就是CCD_。它具有相同的规则,即应用于集合ADT的规则。

如上所述: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

相关内容

  • 没有找到相关文章

最新更新