LinkedHashSet(LHS)クラスのJava ドキュメントから:
LinkedHashSet の反復には、容量に関係なく、セットのサイズに比例する時間が必要です。HashSet の反復は、その容量に比例して時間がかかるため、よりコストがかかる可能性があります。
私の質問は、LHS の反復時間がセットの容量に影響しないのはなぜですか?
LinkedHashSet(LHS)クラスのJava ドキュメントから:
LinkedHashSet の反復には、容量に関係なく、セットのサイズに比例する時間が必要です。HashSet の反復は、その容量に比例して時間がかかるため、よりコストがかかる可能性があります。
私の質問は、LHS の反復時間がセットの容量に影響しないのはなぜですか?
LinkedHashSet は LinkedList と Set の両方を内部的に構成するためです。反復するときは、HashSet ではなく、LinkedList (ダブルだと思います) を反復します。
容量が 1MB の通常の HashSet を作成し (new HashSet(1024 * 1024))、要素を 1 つ追加して反復を試みます。HashSet には要素が 1 つしかありませんが、イテレータは基礎となる hastable の 1MB バケットすべてを処理する必要があります。それは LinkedHashSet であり、反復子はハッシュテーブル (get() と contains() にのみ使用される) を通過しませんが、LinkedList (並列構造) を通過し、その中に要素が 1 つしかありません。
必要な HashSet を反復処理する (ほとんどの場合) 要素を含むバケットを反復処理してから、空の値を削除するため、追加の時間が必要になります。簡単に言えば、空の要素を並べ替えることに関連するオーバーヘッドがあります。
リンクされたコレクションの性質は、すべての要素が次の要素を指すようにすることです。したがって、最初のものから始めて、ほとんど問題なく次のものを引っ張っていきます。このようにして、それらすべてを簡単に反復できます。