HashSet解析

1768 ワード

HashSetはSetインターフェースを実現し、hashテーブルによってサポートされる(実際にはHashMapの例である).HashSetはセットの反復順序を保証しない.特に順序が一定であることを保証しません.null要素の使用を許可します.
           HashSetは、基本的な動作のために、add()、remove()、contains()およびsize()を含む安定した性能を提供し、これらの要素は、hash関数がドラムに正しく分布していると仮定する.セットを反復するために必要な時間は、HashSetのインスタンスのサイズ(要素の数)と、最下のHashMapの例の「容量」との合計に比例する.したがって、HashSetの反復性能が重要であれば、初期容量をあまり高く設定しないようにしてください.HashSetオブジェクトを生成する際には、Set hset=new HashSet(10,0.3)などの初期容量を設定することができ、生成されたhashSetオブジェクトの初期容量は10であり、負荷係数は0.3である.デフォルトのコンストラクタの初期容量は16で、負荷係数は0.75です.
          この実装は同期ではないことに注意してください.複数のスレッドが同時にHashSetセットにアクセスする場合、少なくとも1つのスレッドがセットを変更している場合、それは外部と同期していなければならない. 
          これは通常、このセットを自然にカプセル化したオブジェクトに対して同期動作を実行することによって行われる.このようなオブジェクトが存在しない場合は、Collection.synchronized Set方法を使用して、「包装」集合を行うべきである.この操作は、HashSetインスタンスの予期しない同期アクセスを防ぐために作成時に完了することが望ましい.
        Set s=Collection s.synchronized Set(new HashSet);
このようなiterator方法で戻ってきたのは、ローズマリーを作成した後、ローズマリー自身のremove方法でない限り、集合を修正すると、いつでも任意の方法で変更します.Iteratorは、ControntModification Exceptionを抛り出します.そのため、同時修正に直面しています.将来的に不確定な時間に不確定な行動を起こす危険を冒さないでください.
        ローズマリーの迅速な失敗は保証されていません.一般的には、同期されていないかどうかの同時修正に対して、いかなる硬さを保証することはできません.クイック失敗のディケンサは、Conccurrent Modification Exceptionを最善を尽くして投げ出しています.このため、このようなサブコマンダーの正確性を高めるために、この異常に依存するプログラムを作成するのはエラーです.
            HashSet類にはtranientのプライベートmapがあります.コンストラクションではこのmapを初期化します.
 
         public HashSet() {
               map = new HashMap<E,Object>();
         }
         public HashSet(int initialCapacity, float loadFactor) {
               map = new HashMap<E,Object>(initialCapacity, loadFactor);
         }
        HashSetのコンストラクターから、HashSetの最下層は実はHashMapを使用していて、HashMapの例を用いてセットの要素を操作してからHashSetの動作にカプセル化することが分かります.