JavaのHashSetのの原則は、の質問に直面していますか?

HashSetの実装原理?
まず第一に、私たちはそう繰り返し要素のことを確認してくださいし、それが実現設定されていることを知っておく必要があります。
片手を設定し、最も重要なのは、オペレータを見つけることです。そして、通常我々が選択されます

それは、特に高速検索用に最適化されたので、達成するためのHashSetの。
それは障害の要素のうち、次に、ハッシュ関数を用いHashSetのが見出されます。どの要素がnullであるようにすることです。

最初の実装原則の概要:
(1)HashMapのベースの実装は、デフォルトコンストラクタは、16の初期容量を構築することである、負荷率が0.75のHashMapです。HashMapのオブジェクトは、実際にはキーによって保持さHashSetのハッシュマップへのすべての要素のセットのすべての要素を格納するためのコレクションをカプセル化し、ハッシュマップは、静的オブジェクトのオブジェクトである現在値を、記憶されています。

(2)私たちは、HashMapのキーとしてオブジェクトのクラスを配置しよう、またはクラスを書き換えるために、保存するには、このクラスのHashSetのオブジェクトを置くしようとする(オブジェクトOBJ)equalsメソッドとhashCode()メソッドは、非常に重要である場合にはいずれか、これらの2つの方法が一貫していなければならない戻り:2つのクラスのhashCode(IF))にも等しい(によって真の比較を返すべき方法、同じ値を返します。一般的に言えば、計算のhashCode()キー属性の値を返しに関わるすべてが、それは比較のための標準のequals()として使用する必要があります。

他の動作(3)HashSetのはハッシュマップに基づいています。

我々はHashSetの実装原理を説明するように、このでは、:
それが基づいてHashSetのは、実装が容易であるので、根本的なHashSetのHashMapのは、すべての要素を保持するためにHashMapを使用して実装され、HashSetの関連業務を、関連する方法は基本的に基礎となるHashMapのある直接呼び出します次のように達成し、HashSetのソースコードは次のとおりです。

輸入java.util.AbstractSet。
インポートのjava.util.Collection;
輸入java.util.HashMapを;
輸入java.util.LinkedHashMap。
輸入java.util.Set;

輸入javax.swing.text.html.HTMLDocument.Iterator。

パブリッククラスHashSetの<E>は
AbstractSet <E>が延びる
セット<E>、Cloneableを、java.io.Serializableのを実装
{
静的最終長いのserialVersionUID = -5024744406713321676L。

//すべての要素を格納するために基礎となるHashSetのHashMapを使用しています。
過渡HashMapのプライベート<E、オブジェクト>地図;

値のHashMapのオブジェクトとして、仮想オブジェクトの//定義は、このオブジェクトは、静的なfinalとして定義されます。
プライベート静的最終オブジェクトPRESENT =新しいオブジェクト ();


//デフォルトの引数なしのコンストラクタは、空のHashSetのを構築します。
//
//は、実際の根底にある空のHashMapを初期化し、そして16〜0.75デフォルトの初期容量と負荷係数を使用しています。

HashSetの公開は、(){
新しい新しい地図=のHashMap <E、OBJECT>();
}


//指定されたコレクションの要素を含む新しいセットを構築します。
//
//実際の根本的なデフォルトの負荷係数0.75は、指定された収容するのに十分である
HashMapを作成するための初期容量にすべての要素の//コレクション。
その要素がこのセットに保存されます// @param Cのコレクション。

HashSetの公開(収集C <Eを拡張?>){
新しい新しい= HashMapの<E、OBJECT>マップ(Math.max((INT)(c.size()/ 75F)+ 1、16)。。);
のaddAll(C) ;
}


// InitialCapacityの値とloadFactorが空のHashSetを構築する指定。
//
//基礎となる対応する実パラメータが空のHashMapを作成します。
// @param InitialCapacityの初期容量。
// @paramのloadFactor負荷率。

HashSetの(InitialCapacityの値、フロートloadFactorをINT)公共{
新規新しい地図= HashMapの<E、OBJECT>(InitialCapacityの値、loadFactor);
}


//指定されたInitialCapacityの値は、空のHashSetのを構築します。
//
//実際のパラメータとその下の負荷率に対応するには、空のHashMapを作成loadFactor 0.75です。
// @param InitialCapacityの初期容量。

HashSetのパブリック(int型InitialCapacityの値が){
新しい新しい地図= HashMapの<E、OBJECT>(InitialCapacityの値);
}


// InitialCapacityの値とloadFactorが新しい空のリンクハッシュセットを構築する指定。
アクセスをパッケージ化する//このコンストラクタは、一般に公開されていないが、LinkedHashSetのため、実際のサポート。
//
指定された基本となる構造で//実際のパラメータがnullのLinkedHashMapインスタンスを達成するために。
// @param InitialCapacityの初期容量。
// @paramのloadFactor負荷率。
// @paramダミーマーク。

HashSetの(int型InitialCapacityの値、loadFactorフロート、ブールダミー){
地図のLinkedHashMap新しい新しい= <E、OBJECT>(InitialCapacityの値、loadFactor);
}


//このセットのイテレータの要素を返します。彼らが返される順序は、特定のではありません。
//
キーのすべてを返すために基礎となるHashMapののkeySetへの実際の呼び出しの//下。
// HashSetの可視要素が、キーは、ハッシュマップの下に格納される
オブジェクト識別の静的最終的なオブジェクトを使用して//値。
//がセットでこの要素Iteratorを@return。

公共イテレータ<E>反復子(){
。)(map.keySetを返すイテレータ()。

}

//このセット(セット容量)内の要素の数を返します。
//
//実際のコール底サイズのHashMap()メソッドは、エントリの数を返し、セット内の要素の数を取得します。
このセットの数// @return要素(設定容量)。

INTサイズパブリック(){
戻りmap.size();
}


このセットに要素が含まれていない場合は、//、それはtrueを返します。
//
実際のコールのHashMapのisEmpty()//の底部はHashSetのが空であるか否かを判定する。
// @returnこのセットに要素が含まれていない場合、それはtrueを返します。

ブールのisEmpty公開(){
(map.isEmptyを返します);
}


このセットは、指定された要素が含まれている場合、//、それはtrueを返します。
//より正確には、このセットは満足含まれている場合にのみ(O == nullの電子== nullの: ?O.equals(E))
//ときに電子要素を、trueを返します。
//
//のcontainsKeyが指定したキーが含まれているかどうかを判断するために、実際のコールのHashMapを基礎となります。
// @param O要素のこのセットに存在してテストされています。
このセットは、指定された要素が含まれている場合// @returnは、それはtrueを返します。

ブール{パブリック(オブジェクトO)を含有
map.containsKey(O)を返します;
}


//このセットは、指定された要素は、指定された要素を追加し、なっていないが含まれている場合。
//より正確には、このセットが満足(E == NULL E2 == NULL :? E.equals(E2))が含まれない場合
、次に要素e指定され、このセットに追加し、//要素E2を。
このセットがすでに要素が含まれている場合//、呼び出しはセットを変更し、falseを返していません。
//
HashMapのに実際に重要な要素として//下。
//でキーエントリに新しいHashMapの場合、キーと値のペアを追加するハッシュマップのPUT()メソッドので
、元エントリキーの//同じセットが(trueを返すハッシュコード()値が等しい戻って比較すると等しいです) 、
//エントリは、新しいアドオン値の元のエントリの値をカバーしますが、キーは、任意の変更を持っていない
要素は、既存のHashSetに追加された場合、要素の新しく追加されたコレクションが置かれることはありませんので// HashMapのに、
//オリジナルの要素も非繰り返し特性の要素のセットを満たす任意の変更、ではないでしょう。
// @param eがセットにこの要素を追加します。
// @returnこのセットがすでに指定された要素を含んでいなかったならば、それはtrueを返します。

(E E)を公衆追加ブール{
戻りmap.put(E、PRESENT)== NULL;
}

//このセットから、指定された要素ならば、それが削除されます。
このセットは満足(O == nullの電子== nullの:含まれている場合//より正確には、 ?O.equals(E)) の要素Eを、
//それが削除されます。このセットがすでに要素が含まれている場合は、trueに戻る
//(または:このセットがtrueを返すの呼び出しの結果として変更された場合)。(呼び出しが戻ると、このセットは要素は含まれません)。
//
//基礎となるHashMapのは、実際にremoveメソッドは、指定されたエントリを削除呼び出します。
// @param Oセットのオブジェクトが存在することを削除する必要がある場合。
このセットは、指定された要素が含まれている場合// @returnは、それはtrueを返します。

{ブールパブリック(オブジェクトO)を除去
PRESENT ==戻りmap.remove(O)を;
}


//このセットからすべての要素を削除します。この呼び出しが戻った後、セットは空になります。
//
//実際のすべての要素のエントリHashMapをクリアするための明確な方法を呼び出す基礎となります。

クリアパブリック()無効{
map.clearを();
}

このHashSetのインスタンスのシャローコピーを返す://要素自体はコピーされません。

//実際の呼び出しクローンはHashMap()メソッドの下には、HashMapのの簡易コピーを取得するには、とHashSetのは、中に設定します。

オブジェクトクローンパブリック(){
試み{
HashSetの<E>はnewset(HashSetの<E>を)=(super.cloneする);
newSet.map =(HashMapの<E、オブジェクト>)map.clone();
newsetを返す;
}キャッチ( E CloneNotSupportedException){
スローInternalError新しい新しいです();
}
}
}
---------------------

おすすめ

転載: www.cnblogs.com/hyhy904/p/10930703.html