0

多分私はうるさいですが、javadocにはLinkedHashSetの実装に関する次の情報があります。

この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点でHashSetとは異なります。

LinkedHashSetクラスに二重リンクリストが見つかりません。誰かが助けることができますか?

4

2 に答える 2

6

二重にリンクされたリストは実装側にあり、必ずしも取得して使用できるように公開されているわけではありません。

二重にリンクされたリストを保持するため、アイテムがセットに挿入された順序を追跡できます(また、 access-order LinkedHashMapsの要素にアクセスする順序も追跡できます)。通常のHashSetは、その内容の順序を保証しないため、二重リンクリストは必要ありません。

彼らはおそらくそのビットをjavadocに含めたので、あなたはそれがどのように行われたかを知っていました。また、LinkedHashSetの舞台裏では、通常のHashSetよりも少し多くのことが行われています。

Googleコード検索でソースコードを確認できます(LinkedHashSetは実際にはLinkedHashMapにラップされているだけですが、これはそれほど重要な詳細ではありません)。

結局のところ、これはjavadocsの間違いではなく、LinkedHashSetとLinkedHashMap内で二重にリンクされたリストが機能しているという事実について心配する必要はありません。LinkedHashMapを利用して、挿入の順序を維持し、舞台裏で何が起こっているかを気にする必要はありません。

于 2011-02-03T01:34:47.763 に答える
4

ええ、ドリルダウンせずにソースを見ると少し不安定です。ダミーと呼ばれる意味のないブール値を取るパッケージで保護された HashSet コンストラクターを呼び出すことに注意してください。

public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}

次に、 a のLinkedHashMap代わりに aHashMapを使用してセットをバックアップします。事実上、LinkedHashSet は実際には HashSet 内にあり、パッケージで保護されているだけなので、LinkedHashSet を使用して取得する必要があります。

于 2011-02-03T01:40:57.857 に答える