セットは明確に定義された別個のオブジェクトのコレクションであることがわかっています。 セットの各メンバーは、セットの要素と呼ばれます。 言い換えれば、集合に重複する要素は決して含まれないと言うことができます。 しかし、java Set interfaceでは、HashSet、LinkedHashSet、TreeSetなどのクラスをどのように実装しましたか この一意性を達成する。 この記事では、この一意性の背後にある隠された真実について説明します。
HashsetはJavaで内部的にどのように動作しますか?
注目の読者! 今の学習を停止しないでください。 JavaおよびJava Collectionsの基礎コースでは、学生に優しい価格でJava FoundationおよびCollectionsの重要な概念をすべて把握し、業界の準備ができています。 DSアルゴと、より多くの言語を学ぶからあなたの準備を完了するには、完全な面接準備コースを参照してください。
これを例で理解します。HashSetに重複した要素を追加しようとする次のプログラムの出力を見てみましょう。
import
java.util.HashSet;
class
Test
{
public
static
void
main(String args)
{
HashSet hs =
new
HashSet();
boolean
b1 = hs.add(
"Geeks"
);
boolean
b2 = hs.add(
"GeeksforGeeks"
);
boolean
b3 = hs.add(
"Geeks"
);
System.out.println(
"b1 = "
+b1);
System.out.println(
"b2 = "
+b2);
System.out.println(
"b3 = "
+b3);
System.out.println(hs);
}
}
出力:
b1 = trueb2 = trueb3 = false
出力から、add()メソッドを使用して重複した要素をセットに追加しようとすると、falseが返され、elementが既に存在するため、hashsetに追加されないことは明らかです。 ここで、add()メソッドがセットに既に指定された要素が含まれているかどうかをチェックする方法が問題になります。 Hashsetクラスのadd()メソッドとデフォルトコンストラクタを詳しく見ると、より明確になります。
// predefined HashSet classpublic class HashSet{ // A HashMap object private transient HashMap map; // A Dummy value(PRESENT) to associate with an Object in the Map private static final Object PRESENT = new Object(); // default constructor of HashSet class // It creates a HashMap by calling // default constructor of HashMap class public HashSet() { map = new HashMap(); } // add method // it calls put() method on map object // and then compares it's return value with null public boolean add(E e) { return map.put(e, PRESENT)==null; } // Other methods in Hash Set}
HashSetを作成するたびに、内部的にHashMapを作成し、add()メソッドを使用してこのHashSetに要素を挿入すると、実際にはキーとして指定した要素と”PRESENT”と呼ばれる定数オブジ したがって、集合はHashMapを介して内部的に一意性を達成すると言えます。 ここでは、HashMapとput()メソッドが内部的にどのように機能するかについて全体的な話が出てきます。HashMapでわかっているように、各キーは一意であり、put(Key,Value)メソッドを呼び出すと、keyに関連付けられた前の値を返します。 そのため、add()メソッドでは、mapの戻り値をチェックします。null値を持つput(key,value)メソッド。地図なら
- put(key,value)はnullを返し、次に文”map.put(e,PRESENT)==null”はtrueを返し、要素はHashSet(内部的にはHashMap)に追加されます。
- プット(キー、値)は、キーの古い値を返し、その後、文”マップ。put(e,PRESENT)==null”はfalseを返し、要素はHashSet(内部的にはHashMap)に追加されません。LinkedHashSetがHashSetを拡張するので、内部的にsuper()を使用してhashsetのコンストラクタを呼び出します。 同様に、TreeSetクラスのオブジェクトを作成すると、内部的にNavigable Mapのオブジェクトがバッキングマップとして作成されます。
関連記事:HashmapがJavaで内部的にどのように動作するか。
この記事はGaurav Miglaniによって寄稿されています。 GeeksforGeeksが好きで、貢献したい場合は、contributeを使用して記事を書くこともできます。geeksforgeeks.orgまたはあなたの記事をに郵送して下さい[email protected]メインページに表示されるあなたの記事を参照してくださいし、他のオタクを助けます。