LinkedHashSet詳細
2955 ワード
1、関係を引き継ぐ
2、ハッシュテーブルとチェーンテーブルで実装されたset集合インタフェース、反復方式は私たちが予想したものと一致している(クエリ速度のため、下位層ではハッシュが使用されているが、要素の挿入順序を維持するためにチェーンテーブルが使用されているように見える).これはhashset実装方式とは異なり、そのすべての挿入過程で双方向チェーンテーブルの属性が維持されているためである.チェーンテーブルは反復順序を定義します.すなわち、集合setに要素を挿入する順序です.注意1つの要素が繰り返し挿入されると、集合の挿入順序は変更されません.(要素eがセットsに追加されると、s.add(e)メソッドが呼び出されますが、s.contains(e)はs.add(e)メソッドの前に呼び出され、trueが返されます).
チェーンテーブルの実装はhashsetに挿入される要素の順序の乱れを回避し,TreeSetに実装の代価を増加させることもない.これは、元の集合がどのように実装されているかにかかわらず、元の集合と同様に要素の順序が変更されないset集合を生成するコピーとして使用できます.たとえば、次のようにします.
このテクニックはやはり役に立ちます.特に、1つのセットを入力として、このセットをコピーすると同時に、コピーのセット内の要素の順序はコピー自身で決定することができます.(集合内の要素の順序は、通常、それらが存在する順序と一致します.)
3、クラスはsetセットのすべての操作を提供し、要素がnullであることを許可する.hashsetと同様に,ハッシュ機能はコンテナ内の要素格納位置を割り当てたので,その基本動作(add,remove,contains)の実行時間は定数時間であると仮定した.チェーンテーブルの特性を維持する代価が追加されたため、hashsetよりもパフォーマンスが少し低い.反復にはsetセットのサイズを計算するのに一定の割合が必要であり、容量のサイズにかかわらず.hashset反復のコストは比較的高く,その容量は一定の時間割合を必要とする.
4、LinkedHashSetには、初期化容量とロード属性の2つのパラメータが含まれています.hashsetの面では、正確に定義されています.しかしながら、このような反復回数は容量に影響されないため、インスタンスの大容量を初期化するコストはhashsetのコストよりも小さいことに注意されたい.
この実装は同期されていないことに注意してください.複数のスレッドがlinkedhashsetコンテナに同時に進入し、少なくとも1つのスレッドがsetコンテナを変更した場合、これは外的に同期する必要があります.これは、通常、このsetセットを含むいくつかのオブジェクトを同期して実装されます.このようなオブジェクトが存在しない場合、このセットsetはCollectionsによって扱われるべきである.synchronizedSetメソッド「パッケージ」をクリックします.これは、予期せぬイベントの発生を防ぐために作成時に実行することが望ましい.
5、クラスの反復器によって返される反復回数は非常に効果的である:反復作成後のセットsetが変更された場合、反復器自身のremoveメソッド以外の任意のメソッドを通過すると、反復は異常ConcurrentModificationExceptionを放出する.
したがって、要素を同時に変更すると、反復は迅速ですべて失効し、将来の特定の時点で不確定な動作を冒険するのではなく、すべて失効します.
反復器のfail-fast特性は保証できないことに注意してください.非同期化の修正で保証するように不可能です.fail-fast反復回数は受動的な尽力に基づいてConcurrentModificationException異常を投げ出す.したがって,この異常に依存してその正しさを判定するプログラムを書く考えは間違っている:反復器のfail-fast
動作は、バグの検索としてのみ使用されます.
6、方法概要
Methods inherited from class java.util.HashSet
Methods inherited from class java.util.AbstractSet
Methods inherited from class java.util.AbstractCollection
Methods inherited from class java.lang.Object
Methods inherited from interface java.util.Set
java.lang.Object
java.util.AbstractCollection
java.util.AbstractSet
java.util.HashSet
java.util.LinkedHashSet
2、ハッシュテーブルとチェーンテーブルで実装されたset集合インタフェース、反復方式は私たちが予想したものと一致している(クエリ速度のため、下位層ではハッシュが使用されているが、要素の挿入順序を維持するためにチェーンテーブルが使用されているように見える).これはhashset実装方式とは異なり、そのすべての挿入過程で双方向チェーンテーブルの属性が維持されているためである.チェーンテーブルは反復順序を定義します.すなわち、集合setに要素を挿入する順序です.注意1つの要素が繰り返し挿入されると、集合の挿入順序は変更されません.(要素eがセットsに追加されると、s.add(e)メソッドが呼び出されますが、s.contains(e)はs.add(e)メソッドの前に呼び出され、trueが返されます).
チェーンテーブルの実装はhashsetに挿入される要素の順序の乱れを回避し,TreeSetに実装の代価を増加させることもない.これは、元の集合がどのように実装されているかにかかわらず、元の集合と同様に要素の順序が変更されないset集合を生成するコピーとして使用できます.たとえば、次のようにします.
void foo(Set m){
Set s=New LinkedHashSet(m);
}
このテクニックはやはり役に立ちます.特に、1つのセットを入力として、このセットをコピーすると同時に、コピーのセット内の要素の順序はコピー自身で決定することができます.(集合内の要素の順序は、通常、それらが存在する順序と一致します.)
3、クラスはsetセットのすべての操作を提供し、要素がnullであることを許可する.hashsetと同様に,ハッシュ機能はコンテナ内の要素格納位置を割り当てたので,その基本動作(add,remove,contains)の実行時間は定数時間であると仮定した.チェーンテーブルの特性を維持する代価が追加されたため、hashsetよりもパフォーマンスが少し低い.反復にはsetセットのサイズを計算するのに一定の割合が必要であり、容量のサイズにかかわらず.hashset反復のコストは比較的高く,その容量は一定の時間割合を必要とする.
4、LinkedHashSetには、初期化容量とロード属性の2つのパラメータが含まれています.hashsetの面では、正確に定義されています.しかしながら、このような反復回数は容量に影響されないため、インスタンスの大容量を初期化するコストはhashsetのコストよりも小さいことに注意されたい.
この実装は同期されていないことに注意してください.複数のスレッドがlinkedhashsetコンテナに同時に進入し、少なくとも1つのスレッドがsetコンテナを変更した場合、これは外的に同期する必要があります.これは、通常、このsetセットを含むいくつかのオブジェクトを同期して実装されます.このようなオブジェクトが存在しない場合、このセットsetはCollectionsによって扱われるべきである.synchronizedSetメソッド「パッケージ」をクリックします.これは、予期せぬイベントの発生を防ぐために作成時に実行することが望ましい.
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
5、クラスの反復器によって返される反復回数は非常に効果的である:反復作成後のセットsetが変更された場合、反復器自身のremoveメソッド以外の任意のメソッドを通過すると、反復は異常ConcurrentModificationExceptionを放出する.
したがって、要素を同時に変更すると、反復は迅速ですべて失効し、将来の特定の時点で不確定な動作を冒険するのではなく、すべて失効します.
反復器のfail-fast特性は保証できないことに注意してください.非同期化の修正で保証するように不可能です.fail-fast反復回数は受動的な尽力に基づいてConcurrentModificationException異常を投げ出す.したがって,この異常に依存してその正しさを判定するプログラムを書く考えは間違っている:反復器のfail-fast
動作は、バグの検索としてのみ使用されます.
6、方法概要
Methods inherited from class java.util.HashSet
add, clear, clone, contains, isEmpty, iterator, remove, size
Methods inherited from class java.util.AbstractSet
equals, hashCode, removeAll
Methods inherited from class java.util.AbstractCollection
addAll, containsAll, retainAll, toArray, toArray, toString
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface java.util.Set
add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray