LinkedHashMap/Set は Collection へのエントリの順序を保持するため、パフォーマンスが少し低下します。なぜこれが起こるのか知りたいです。
3 に答える
LinkedHash[Map/Set]
二重にリンクされたリストを使用して、エントリの順序を追跡します。したがって、要素が追加されるたびに、新しい DLL ノードを作成する必要があります。割り当てには時間がかかり、いくつかの追加のポインターを設定する必要があります。
問題は、LinkedHash[マップ/セット] がリンクされていない対応物よりも常にパフォーマンスが悪いという無効な仮定を立てていることです。
LinkedHash[Map/Set] には、リンクされたリストを形成するために使用されるポインターを維持するという追加のタスクがあります。これは、追加または削除を実行するときに、Hash[Map/Set] よりもパフォーマンスがわずかに悪いことを意味します (それでも一定時間です)。
ただし、LinkedHash[Map/Set] を反復処理する場合、パフォーマンスはセットのサイズに比例しますが、リンクされていない対応物はセットの容量に比例します。Hash[Map/Set] を反復処理するときの最良のシナリオは、容量がすべての要素に適合するのに十分な大きさ (つまり、容量 = サイズ) の場合であり、そのような場合でも同じパフォーマンスが得られます。また、非常に静的なセット/マップがあり、容量を設定しない限り、容量が同じサイズになる可能性は低いことに注意してください。
したがって、マップ/セットの構築のパフォーマンスに関心がある場合は、HashMap または HashSet を選択する必要がありますが、そのマップ/セットの反復処理に関心がある場合は、LinkedHashMap または LinkedHashSet を選択してください。
参照: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
LinkedHashMap
/Set
には、ハッシュ テーブルとリンク リストの 2 つのデータ構造が含まれているため、挿入操作と削除操作によって 2 つのデータ構造が変更されますが、単純なHashMap
操作では 1 つのデータ構造 (ハッシュ テーブル) のみが変更されます。LinkedHashMap
/Set
が遅くなり、より多くのメモリを消費するのはそのためです。