JavaRush /Java Blog /Random-JA /Javaのハッシュセット
渚古河
レベル 30
Москва

Javaのハッシュセット

Random-JA グループに公開済み
このクラスはHashSetインターフェイスを実装しSet、ハッシュ テーブルに基づいており、インスタンスによってもサポートされますHashMapHashSet要素は順序付けされていないため、時間が経っても要素が同じ順序になるという保証はありません。追加、削除、検索の操作は、ハッシュ関数が要素を「バケット」に正しく分配する限り、一定時間で実行されます。これについては後で説明します。 Java のハッシュセット - 1に関するいくつかの重要なポイントHashSet:
  • なぜなら クラスはインターフェースを実装しますSetが、一意の値のみを格納できます。
  • NULL 値を保存できます。
  • 要素が追加される順序はハッシュ コードを使用して計算されます。
  • HashSetSerializableとも実装しますCloneable
操作の実行時間を一定に維持するには、 のアクションに費やされる時間は、 の要素の数+ 組み込みインスタンスの「容量」(「バスケット」の数)HashSetに正比例する必要があります。したがって、性能を維持するには、初期容量を高くしすぎない(負荷率を低くしすぎない)ことが重要です。初期容量 – ハッシュ テーブル内のセル (「ビン」) の初期数。すべてのセルが入力されると、その数は自動的に増加します。負荷率は、容量が自動的に増加するまでにどれだけ満たされるかを示す尺度です。初期容量と負荷率の積よりも要素数が多くなった場合、ハッシュテーブルの再ハッシュ(要素のハッシュコードを再計算し、得られた値に基づいてテーブルを再構築すること)が行われ、要素数が増加します。その中の細胞の数は2倍になります。 負荷係数 = テーブルに格納されている要素の数 / ハッシュ テーブルのサイズ たとえば、テーブル内のセルの初期数が 16 で、負荷係数が 0.75 の場合、入力されたセルの数が 12 に達すると、セルの数は自動的に増加します。負荷率と初期容量は、 のパフォーマンスに影響を与える 2 つの主な要素です。負荷率 0.75 では、平均して良好なパフォーマンスが得られます。このパラメータを増やすと、(再ハッシュと再構築の回数が減るため) メモリ負荷は減少しますが、追加と検索の操作に影響します。再ハッシュにかかる時間を最小限にするには、適切な初期容量パラメータを選択する必要があります。初期容量が要素の最大数を負荷率で割った値より大きい場合、再ハッシュ操作はまったく発生しません。 HashSetHashMapHashSetHashSetHashSet重要:HashSetは同期機能が組み込まれたデータ構造ではないため、複数のスレッドが同時に作業しており、そのうちの少なくとも 1 つが変更を加えようとしている場合は、外部からの同期アクセスを提供する必要があります。これは多くの場合、 をカプセル化する別の同期オブジェクトを犠牲にして行われますHashSet。そのようなオブジェクトがない場合は、Collections.synchronizedSet(). 現時点では、これが との非同期操作を防ぐ最善の方法ですHashSet
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet コンストラクター:
  1. HashSet h = new HashSet(); - デフォルトのコンストラクター。デフォルトの初期容量は 16、負荷率は 0.75 です。
  2. HashSet h = new HashSet(int initialCapacity)– 指定された初期容量を持つコンストラクター。負荷率 – 0.75。
  3. HashSet h = new HashSet(int initialCapacity, float loadFactor);— 指定された初期容量と負荷係数を持つコンストラクター。
  4. 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実装によって内部的にサポートされますMapHashSetを使用して要素を格納しますHashMapHashMap要素を追加するには、要素をキーと値のペアとして表す必要がありますが、 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()HashMapremove()remove()HashMap
public boolean remove(Object o)
{
  return map.remove(o) == PRESENT;
}
HashSetはハッシュ テーブルに基づいており、追加、削除、または検索操作は平均して一定 (O(1)) 時間で完了します。 メソッドHashSet:
  1. boolean add(E e)HashSet: 要素が存在しない場合はに要素を追加しますが、そのような要素がすでに存在する場合、メソッドはfalseを返します。
  2. void clear():セットからすべての要素を削除します。
  3. boolean contains(Object o):指定された要素がセット内に存在する場合はtrueを返します。
  4. boolean remove(Object o): 指定された要素が存在する場合、セットから削除します。
  5. Iterator iterator(): セットの要素のイテレータを返します。
  6. boolean isEmpty():セット内に要素がない場合はtrueを返します。
  7. Object clone(): サーフェスのクローン作成を実行しますHashSet
Javadoc: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION