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

しかし、次のように変更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

私の質問は明確化の 1 つです。誰かがこれを理解するのを助けることができますか? LinkedHashSetaは等しいと見なされるのに、同じとは見なされないのはなぜLinkedListですか? Listand が役割を果たしているという定義を仮定していますがSet、よくわかりません。

基本的にはsを同じと考えればSetsも同じと考えないListのか?逆もまた然り(要素が重複していないと仮定)?

4

2 に答える 2

13

行う保証LinkedHashSetは、反復順序に関するものです。ただし、それはまだでSetあり、セット自体は順序を気にしません。List一方、Aはそうです。List3 番目の位置に要素を持つAListは、1 番目の位置に同じ要素を持つ別の要素と同じではありません。

Setequals(Object)メソッドの javadoc

指定されたオブジェクトもセットであり、2 つのセットが同じサイズであり、指定されたセットのすべてのメンバーがこのセットに含まれている (または、このセットのすべてのメンバーが指定されたセットに含まれている) 場合は、true を返します。この定義により、set インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。

LinkedHashSetjavadocの状態

Set インターフェイスのハッシュ テーブルとリンク リストの実装。反復順序は予測可能です。

ALinkedHashSetSetです。同じルールがあります。セットの ADT に適用されるもの。

于 2014-04-25T20:09:51.363 に答える