0

LinkedHashSet(LHS)クラスのJava ドキュメントから:

LinkedHashSet の反復には、容量に関係なく、セットのサイズに比例する時間が必要です。HashSet の反復は、その容量に比例して時間がかかるため、よりコストがかかる可能性があります。

私の質問は、LHS の反復時間がセットの容量に影響しないのはなぜですか?

4

3 に答える 3

4

LinkedHashSet は LinkedList と Set の両方を内部的に構成するためです。反復するときは、HashSet ではなく、LinkedList (ダブルだと思います) を反復します。

于 2013-01-21T16:40:13.697 に答える
1

容量が 1MB の通常の HashSet を作成し (new HashSet(1024 * 1024))、要素を 1 つ追加して反復を試みます。HashSet には要素が 1 つしかありませんが、イテレータは基礎となる hastable の 1MB バケットすべてを処理する必要があります。それは LinkedHashSet であり、反復子はハッシュテーブル (get() と contains() にのみ使用される) を通過しませんが、LinkedList (並列構造) を通過し、その中に要素が 1 つしかありません。

于 2013-01-21T16:55:59.057 に答える
0

必要な HashSet を反復処理する (ほとんどの場合) 要素を含むバケットを反復処理してから、空の値を削除するため、追加の時間が必要になります。簡単に言えば、空の要素を並べ替えることに関連するオーバーヘッドがあります。

リンクされたコレクションの性質は、すべての要素が次の要素を指すようにすることです。したがって、最初のものから始めて、ほとんど問題なく次のものを引っ張っていきます。このようにして、それらすべてを簡単に反復できます。

于 2013-01-21T16:59:50.130 に答える