2015-01-13 6 views
11

どんなスレッドでも内部的で合理的な説明はありません。 私に正確な理由を教えてください。なぜリンクされたハッシュマップは、反復のために二重にリンクされたリストを維持するのですか?

  1. 1つのリンクリストで維持するだけで十分でしょうか?

  2. このシナリオでどのようにリンクリストがパフォーマンスを向上させるか

  3. すべてのメソッドはhashmap xpt 4メソッドから継承されていますが、ハッシュマップのイテレータは順序を保持しませんが、リンクされたハッシュマップはその順序を維持しますか?

+0

私は二重にリンクされたリストは、順序を助けるとは思わない、それはちょうどそれがトラバーサルを容易にしない –

+0

簡単にリストをトラバースします。これは単にマップエントリの削除をより効率的にするだけです。 –

答えて

1

LinkedListのが二重に存在し挿入注文を維持するために。任意の時点で、ノードまたは後方ノードに進むことができます。しかし、ポインタが最後の要素に移動した場合に単一のLinkedListを持っている場合は、最初の点から開始する必要があり、前のノードで移動することはできません。名前が示唆する両方のポインタが発注目的のために使用され、挿入の場合には、ポインタを調整するために使用されているよう

した後、前 : -

+2

が、私は二重にリンクされたリストは、順序を助けるとは思わない、それはちょうどあなたが内部のHashMapがLinkedListのに基づいて表示された場合 –

+0

簡単にリストをトラバースします。そのノードの前または後にどのノードが挿入されたかのような情報を持っているならば、それは単純に順序付けです。 – Prashant

+0

注文を維持するには、単独でリンクされたリストで十分です。この文脈で二重リンクリストを使用した理由については、これは正しい説明ではありません。 –

3

のLinkedHashMapは、基本的に、すなわち、各エントリのための2つのポインタを維持しますまたは削除。

8

単独でリンクされたリストを維持して、挿入注文を追跡する必要があることは間違いありません。しかし、単一リンクリストを効率的に維持するには、実際には二重リンクリストが必要です。

A ---> B ---> C 

ために、3つのエントリを考えてみましょうあなたはBを削除したとします。明らかにACを指すはずです。しかし、あなたがBの前にエントリを知っていなければ、どのエントリが現在Cを指すべきかを効率的に言うことができません。これを修正するには、両方向を指すエントリが必要です。

---> ---> 
A  B  C 
    <--- <--- 

この方法で、あなたは直前のエントリを見ることができますBを削除し、BAC)と更新後のようA、互いにCポイント。

HashMapは、4つのメソッド以外のすべてのメソッドが継承されていますが、LinkedHashMapは挿入順を維持しているため、非常に賢明に書かれています。ほとんどの実装固有の操作は、ではなく、HashMap.Entryのメンバーです。 LinkedHashMapstaticクラスHashMap.EntryHashMapに拡張するprivate staticクラスLinkedHashMap.Entryを持ちます。あなたがputremoveを呼び出すと、それは情報の前と後を追跡エントリ自身であるので、例えば、LinkedHashMapのコードはHashMapのコードと同じにすることができます。一例として、ここでIは、オーダーを維持するために、アクセス順序を維持するために使用することができる

private void remove() { 
    before.after = after; 
    after.before = before; 
} 
0

のLinkedHashMap上に説明したLinkedHashMap.Entry.remove()の完全にコードがあります。 のLinkedHashMapので、バケット内のリストを維持するためのハッシュマップの同じ機能を継承基準を使用しました。彼らは(参照後前とを使用した)二重リンクリストを使用するが、それは単独でリンクされたリストを使用して行うことができ、挿入順序を維持するため

。同時に、彼らはアクセス順序の機能を実現するために持っているという点で、彼らは最後に要素の頻繁な動きを必要としているが、彼らは二重にリンクされたリストを使用し、頻繁な削除のために頻繁に削除する必要があります。

関連する問題