この記事では、HashsetがJavaで内部的にどのように機能するかを見ていきます。Javaの
- HashSetは一意の値のみを格納します。
- HashSetは、JavaのHashMapと同じようにハッシュの概念に基づいて動作しますが、その動作はHashMapとは次のように異なります-
- HashMapで(Key,Value)ペアが追加され、hash関数はkeyを使用して計算されます。
- ここで、HashSetハッシュ関数のasは値自体を使用して計算されます。 HashSetでは、パラメータとして追加される要素だけを取るadd(e e)メソッドを持っていることに注意してください。また、ハッシュ関数はvalueを使用して計算されるため、uniquevaluesのみがHashSetに格納されているため、今では推測している可能性があります。 同じ要素を再度格納しようとすると、計算されたハッシュ関数は同じになるため、要素は上書きされます。
HashSetは内部的にhashmap
を使用しますJavaのHashSetの内部実装に戻ります最も重要な点は、hashsetクラスの実装が内部的にhashmapを使用して要素を格納することです。
HashSet内には、パラメータを持たないコンストラクタと、初期容量または負荷係数を持つコンストラクタがいくつかありますが、これらのコンストラクタHashSetは内部的にHashMapを使用するため、HashmapがJavaで内部的にどのように機能するかを知ることで、HashsetがJavaで内部的にどのように機能するかを理解するのに役立
HashSet Constructor snippets
JavaのHashSetクラスでは、クラスのコンストラクタがHashMapを作成していることがわかります。
/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() { map = new HashMap<>();}
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor);}
そして、値を格納するために使用されるマップは、コンストラクタで
private transient HashMap<E,Object> map;
として定義されていますが、気づいた場合は、initial capacityとload factorという名前のパラメータがあつまり、長さ16の配列(またはバケット)が作成され、デフォルトの負荷係数は0.75です。 ここで、負荷率は、ハッシュテーブルがどのくらいいっぱいになるかの尺度ですその容量は自動的に増加します。
要素の追加方法-HashSet内部実装
上記のポイント2で、HashSetはvalue自体を使用してハッシュ関数を計算し、HashSetに(Key、Value)ペアがないことを述べ、HashSetが内部的にHashMapを使用してオブジェクトを格納するステートメントが来たと述べました。これらの2つの文は、HashMapストア(キー、値)のペアとして矛盾しているように聞こえるかもしれませんので、これらのtwocontradictory文がどのように真実であるかを見てみ
実際にはhashsetクラスのaddメソッドからHashMapのput()メソッドが呼び出され、セットにビーズがある値がキーになり、定数オブジェクト”PRESENT”が値として使用されます。
これがHashSet実装でPRESENTがどのように定義されているかです-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
そして、それはaddメソッドがHashSetクラスで実装されている方法です-
public boolean add(E e) { return map.put(e, PRESENT)==null;}
したがって、HashSetの内部実装では、実際に取得されている(key、value)ペアであることがわかりますadded.It実際の値(HashSetに追加される)がキーになり、ダミー値”PRESENT”がバッキングHashMapに格納されているときに値として追加されるだけです。
例えば、HashSet-setに要素を追加するためのステートメント。add(“Mumbai”);内部的にmapに変換されます。put(“Mumbai”,PRESENT); そして、バッキングHashMapインスタンスに追加しました。
ここで注意すべきことの1つは、HashMapの値は重複している可能性がありますが、キーは一意である必要があります。 これは、hashsetに格納される値がhashmapに格納されている間にキーになるため、一意の値のみが格納されていることをHashsetが確認する方法です。
要素が削除される方法-HashSet内部実装
HashSetから要素を削除する必要がある場合は、内部的に再びHashSetcallsのメソッドを削除します(オブジェクトキー)HashMapのメソッ
これがHashSetクラスで実装されている方法です。
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
ここでは、HashMapのremove(Object key)メソッドがキーに関連付けられた値を返すことに注意してください。一方、hashsetのremove(Object o)メソッドはBoolean値を返します。 また、HashSetに追加されたすべてのvalueaddedに対して、内部的に関連付けられたHashMapに追加されると、valueはKeyになり、valueは常にPRESENTと呼ばれるanobjectであることがわかります。 したがって、HashMapのremove(Object key)メソッドから返される値は常に存在するため、条件マップが存在します。削除(o)==存在します。
JavaのHashSetから要素を取得する方法
HashSetには、MapまたはListで提供されているgetメソッドはありません。 HashSet iteratorには、セットの値を反復処理するiteratethroughがあります。 内部的には、値がhashmapのキーセットとして格納されるため、hashsetに格納されている値が取得されるため、hashsetのキーセットが呼び出されます。
これが、IteratorがJavaのHashSetに内部的に実装されている方法です。
/*** Returns an iterator over the elements in this set. The elements* are returned in no particular order.** @return an Iterator over the elements in this set* @see ConcurrentModificationException*/public Iterator<E> iterator() { return map.keySet().iterator();}
注意点
- ハッシュ関数がキーを使用して計算されるHashMapとは異なり、hashsetは値自体を使用してハッシュ関数を計算します。
- ハッシュ関数はvalueを使用して計算されるため、一意の値のみがHashSetに格納されます。
- HashSetは内部的にHashMapを使用して要素を格納します。
- add(e e)メソッドを使用して要素がhashsetに追加されると、内部的にhashsetはHashMapのput()メソッドを呼び出します。addメソッドで渡された値はput()メソッドのキーになります。 ダミー値”PRESENT”は、put()メソッドの値として渡されます。
学習のための推奨事項(Udemyコース)
- Javaプログラミングマスタークラスコース
- Java In-Depth:完全なJavaエンジニアになろう!
- Spring Framework Master Class Course
- Complete Python Bootcamp Course
- データサイエンスと機械学習のためのPython
このトピックでは、HashsetがJavaで内部的にどのように動作するかを説明します。 あなたが作るために何か疑問や提案がある場合は、コメントをドロップしてください。 ありがとう!
関連トピック
- ArrayListがJavaで内部的に動作する方法
- HashMapがJavaで内部的に動作する方法
- LinkedListクラスがJavaで内部的に動作する方法
- LinkedHashSet In Java With Examples
- TreeSet In Java With Examples
あなたも好きかもしれません-