問題
下のどのような記憶素子の(1)LinkedHashSetの?
(2)LinkedHashSetのとHashSetの違いは何ですか?
(3)LinkedHashSetのは、それを命じたのですか?
(4)LinkedHashSetのは、それをソートするアクセス順序の要素によってサポートされていますか?
簡単な紹介
HashSetの上で我々は要素が順序付けられていないと言う、その要素がそれを命じているのSetを保証する方法はありませんか?
答えはもちろんです。
今日のヒーローは、この機能を持ってLinkedHashSetの、それはそれはどのように秩序ありますか?さんが一緒に学びましょう。
ソースコード解析
LinkedHashSetの継承のHashSetから、のは、直接彼らに何が違うのソースコードを見てみましょう。
パッケージjava.utilのクラス; // HashSetのから継承されますLinkedHashSetの パブリック クラス LinkedHashSetの<E> 拡張のHashSet <E> 道具がセット <E> 、Cloneableを、java.io.Serializableの{ プライベート 静的最終長い serialVersionUIDを= - 2851667679971038690L ; // 入ってくる容量そして、の負荷率 公共 LinkedHashSetの(INT InitialCapacityの値、フロートloadFactor){ スーパー(InitialCapacityの値、loadFactor、真の); } // のみ着信容量、0.75負荷率デフォルト パブリック LinkedHashSetの(INTInitialCapacityの値){ 、.75f、スーパー(InitialCapacityの値はtrue ); } // 16のデフォルトの容量、0.75のデフォルトの負荷係数 パブリックLinkedHashSetの(){ スーパー(16、.75f、真の); } // Cのセットのすべての要素LinkedHashSetのに添加 // 計算能力が途中変更された場合、奇妙 // HashSetのはMath.max((INT)(c.size()/ 75F)+。1、16)が使用されるが 、// これを理解しにくい少しは、怠け者の著者でありますか? 公共 LinkedHashSetの(コレクション<Eを拡張?> C){ スーパー(Math.max(2 * c.size()、11。 )、.75f、真の); のaddAll(C)。 } // 主にマルチスレッドの並列反復プロセスに使用される分割可能なイテレータ、 @Override 公共 Spliterator <E> spliterator(){ リターン Spliterators.spliterator(この、Spliterator.DISTINCT | Spliterator.ORDERED); } }
以上、オーバー、そんなに、これは本当に、すべてのソースコードです。
見ることができる、LinkedHashSetの建設方法の4つのうち5つの方法、の合計を提供し、反復子があります。
4コンストラクタはの父と呼ばれているsuper(initialCapacity, loadFactor, true);
この方法。
それのようなこの方法を見て?
私たちはpublicコンストラクタ上にないこと言ったときに覚えていますか?それがあります。
// のHashSetのコンストラクタ HashSetの(INT InitialCapacityの値、フロートloadFactor、ブールダミー){ 地図 = 新しい新 AのLinkedHashMap <> (InitialCapacityの値、loadFactor); }
上記のLinkedHashMapはHashSetのマップを初期化するように構成された使用方法を示しました。
今、このロジックは非常に明確にする必要があり、HashSetの、それの追加、削除、クエリや他の方法からLinkedHashSetのの継承はHashSetのは、直接使用されている、唯一の違いは、それがのLinkedHashMap記憶素子を使用することです。
あなたがそれに答えることができればまあ、それはいくつかの質問で始まりますか?
概要
底(1)のLinkedHashMap LinkedHashSetの記憶素子が使用されます。
(2)LinkedHashSetのは、それは、挿入の順にソートされ、順序付けられます。
卵
上記の研究を通じて、我々は、LRUを実装するために使用することができますされるための要素を通過する要素のLinkedHashMapのアクセスによってサポートされている基礎となるLinkedHashSetののLinkedHashMap記憶素子の使用は、と、覚えていることを知っていますか?ポータル[ Javaソースコード解析のサイケのLinkedHashMapコレクション ]
だから、LinkedHashSetのは、それをソートするアクセス順序の要素によってサポートされていますか?
のは、次を分析してみましょう。
次のようにまず、LinkedHashSetのすべての建設方法は、HashSetのコンストラクタで呼び出されます。
// のHashSetのコンストラクタ HashSetの(INT InitialCapacityの値、フロートloadFactor、ブールダミー){ 地図 = 新しい新 AのLinkedHashMap <> (InitialCapacityの値、loadFactor); }
すると、以下のように、コンストラクタの初期化のLinkedHashMapマップを呼び出すことにより:
公共のLinkedHashMap(INT InitialCapacityの値、フロートloadFactor){ スーパー(InitialCapacityの値、loadFactor)。 accessOrder = 偽; }
死者への書き込みが偽accessOrderそれはここで見ることができます。
だから、LinkedHashSetのは要素をソートするアクセス順序によってサポートされていないだけで挿入順にソートすることができます