このクラスは
HashSet
インターフェイスを実装しSet
、ハッシュ テーブルに基づいており、インスタンスによってもサポートされますHashMap
。HashSet
要素は順序付けされていないため、時間が経っても要素が同じ順序になるという保証はありません。追加、削除、検索の操作は、ハッシュ関数が要素を「バケット」に正しく分配する限り、一定時間で実行されます。これについては後で説明します。 に関するいくつかの重要なポイントHashSet
:
- なぜなら クラスはインターフェースを実装します
Set
が、一意の値のみを格納できます。 - NULL 値を保存できます。
- 要素が追加される順序はハッシュ コードを使用して計算されます。
HashSet
Serializable
とも実装しますCloneable
。
HashSet
に正比例する必要があります。したがって、性能を維持するには、初期容量を高くしすぎない(負荷率を低くしすぎない)ことが重要です。初期容量 – ハッシュ テーブル内のセル (「ビン」) の初期数。すべてのセルが入力されると、その数は自動的に増加します。負荷率は、容量が自動的に増加するまでにどれだけ満たされるかを示す尺度です。初期容量と負荷率の積よりも要素数が多くなった場合、ハッシュテーブルの再ハッシュ(要素のハッシュコードを再計算し、得られた値に基づいてテーブルを再構築すること)が行われ、要素数が増加します。その中の細胞の数は2倍になります。 負荷係数 = テーブルに格納されている要素の数 / ハッシュ テーブルのサイズ たとえば、テーブル内のセルの初期数が 16 で、負荷係数が 0.75 の場合、入力されたセルの数が 12 に達すると、セルの数は自動的に増加します。負荷率と初期容量は、 のパフォーマンスに影響を与える 2 つの主な要素です。負荷率 0.75 では、平均して良好なパフォーマンスが得られます。このパラメータを増やすと、(再ハッシュと再構築の回数が減るため) メモリ負荷は減少しますが、追加と検索の操作に影響します。再ハッシュにかかる時間を最小限にするには、適切な初期容量パラメータを選択する必要があります。初期容量が要素の最大数を負荷率で割った値より大きい場合、再ハッシュ操作はまったく発生しません。 HashSet
HashMap
HashSet
HashSet
HashSet
重要:HashSet
は同期機能が組み込まれたデータ構造ではないため、複数のスレッドが同時に作業しており、そのうちの少なくとも 1 つが変更を加えようとしている場合は、外部からの同期アクセスを提供する必要があります。これは多くの場合、 をカプセル化する別の同期オブジェクトを犠牲にして行われますHashSet
。そのようなオブジェクトがない場合は、Collections.synchronizedSet()
. 現時点では、これが との非同期操作を防ぐ最善の方法ですHashSet
。
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet コンストラクター:
HashSet h = new HashSet();
- デフォルトのコンストラクター。デフォルトの初期容量は 16、負荷率は 0.75 です。HashSet h = new HashSet(int initialCapacity)
– 指定された初期容量を持つコンストラクター。負荷率 – 0.75。HashSet h = new HashSet(int initialCapacity, float loadFactor);
— 指定された初期容量と負荷係数を持つコンストラクター。HashSet h = new HashSet(Collection C)
– 別のコレクションから要素を追加するコンストラクター。
HashSet
。
import java.util.*;
class Test
{
public static void main(String[]args)
{
HashSet<String> h = new HashSet<String>();
// Add elements to the HashSet using the add() method
h.add("India");
h.add("Australia");
h.add("South Africa");
h.add("India");// try to add another same element
// Print the elements of the HashSet to the console
System.out.println(h);
System.out.println("List contains India or not:" +
h.contains("India"));
// Remove elements from the set using the remove() method
h.remove("Australia");
System.out.println("List after removing Australia:"+h);
// Loop through the elements of the HashSet using an iterator:
System.out.println("Iterating over list:");
Iterator<String> i = h.iterator();
while (i.hasNext())
System.out.println(i.next());
}
}
結論:
[South Africa, Australia, India]
List contains India or not:true
List after removing Australia:[South Africa, India]
Iterating over list:
South Africa
India
インターフェイスを実装するすべてのクラスは、Set
実装によって内部的にサポートされますMap
。HashSet
を使用して要素を格納しますHashMap
。HashMap
要素を追加するには、要素をキーと値のペアとして表す必要がありますが、 HashSet
追加されるのは値のみです。実際、渡す値はHashSet
オブジェクトのキーでありHashMap
、定数が値として使用されますHashMap
。こうすることで、すべてのキーと値のペアで、すべてのキーが同じ値を持つようになります。 実装: HashSet
_java doc
private transient HashMap map;
// Constructor - 1
// All constructors implicitly create a HashMap object.
public HashSet()
{
// Create an implicit HashMap object
map = new HashMap();
}
// Constructor- 2
public HashSet(int initialCapacity)
{
// Create an implicit HashMap object
map = new HashMap(initialCapacity);
}
// An object of the Object class, each time acting as a value in the HashMap
private static final Object PRESENT = new Object();
メソッドadd()
yを見ると、次のようになりますHashSet
。
public boolean add(E e)
{
return map.put(e, PRESENT) == null;
}
メソッドadd()
y が内部オブジェクトのHashSet
メソッドを呼び出し、追加する要素をキーとして、PRESENT 定数を値として渡していることがわかります。この方法も同様に機能します。内部オブジェクトメソッドを呼び出します。 put()
HashMap
remove()
remove()
HashMap
public boolean remove(Object o)
{
return map.remove(o) == PRESENT;
}
HashSet
はハッシュ テーブルに基づいており、追加、削除、または検索操作は平均して一定 (O(1)) 時間で完了します。 メソッドHashSet
:
boolean add(E e)
HashSet
: 要素が存在しない場合はに要素を追加しますが、そのような要素がすでに存在する場合、メソッドはfalseを返します。void clear():
セットからすべての要素を削除します。boolean contains(Object o)
:指定された要素がセット内に存在する場合はtrueを返します。boolean remove(Object o)
: 指定された要素が存在する場合、セットから削除します。Iterator iterator()
: セットの要素のイテレータを返します。boolean isEmpty()
:セット内に要素がない場合はtrueを返します。Object clone()
: サーフェスのクローン作成を実行しますHashSet
。
GO TO FULL VERSION