Java Hungry
core java interview questionでは、コレクションフレームワークの質問が殺到するのが一般的です。 私はゴールドマン-サックスでインタビューを受け、そこで彼らは私がdumbstruckを得た質問をしました。 インタビュアーは、Hashsetの内部動作、またはhashsetがjavaでどのように機能するか、JavaでSetをどのように実装するのかを尋ねました。 つまり、Set InterfaceまたはSet Interfaceを実装するクラスを使用せずに、すべての要素が一意であることを確認する方法です。
Read Also:how hash map works in java
私は答えを出しましたが、インタビューラウンドも修飾しましたが、答えは満足のいくものではありません。
だから家に帰って調べてみた。 だから最終的に私は答えを得て、あなたとそれを共有します。
Javaで内部的に実装を設定する
セット内のすべての要素は一意です。 そのため、setに重複した要素はありません。
したがって、javaでセットに要素を追加したい場合は、次のようなコードを記述します
public class JavaHungry{public static void main(String args){//TODO自動生成メソッドstub HashSet<Object>hashset=new HashSet<Object>();hashset。add(3);hashset.を追加しました("Java Hungry");hashset.add("Blogspot");システム。出ろprintln("Set is"+hashset); }}
それは結果を印刷します : セットは
です今、上記のコード
パブリッククラスJavaHungry{パブリック静的voidメイン(文字列args){HashSet<オブジェクト>hashset=新しいHashSet<オブジェクト>();hashset。add(3);hashset.を追加しました("Java Hungry");hashset.add("Blogspot");hashset.add(3);//要素hashsetを複製します。add("Java Hungry");//要素システムを複製します。出ろprintln("Set is"+hashset); }}
それは結果を印刷します : Set is
さて、Setオブジェクトのadd()メソッドで重複した要素を渡すと内部的に何が起こるか、要素がすでに存在するため、falseを返し、HashSetに追加しません。
しかし、主な問題は、それがどのようにfalseを返すかということです。 だからここに答えがあります
Java Apiでadd()メソッドのHashSet実装を開いたときの答えは次のとおりですrt.jar その中に次のコードがあります
public class HashSet<E>extends AbstractSet<e>implements Set<E>,Cloneable,java.io.....Serializable{private transient HashMap<E,Object>map;//バッキングマップ内のオブジェクトに関連付けるダミー値private static final Object PRESENT=new Object();public HashSet(){map=new HashMap<>(); } // いくつかのコード、つまりハッシュ内の他のメソッドSet public boolean add(e e){return map.put(e,PRESENT)==null;}//いくつかのコード、すなわちハッシュセット内の他のメソッド}
そのため、Hashmapを介して内部的にjavaでSetで一意性を達成しています。 Hashsetのオブジェクトを作成するたびに、上記のコードの斜体の行でわかるように、HashMapのオブジェクトが作成されます。
hashmapがjavaで内部的にどのように動作するかについてはすでに説明しました。
HashMapでわかっているように、各キーは一意です。 したがって、セットで行うことは、hashmapのキーとしてeであるadd(Elemene E)の引数を渡すことです。 次に、キーに値を関連付ける必要があるため、Java api開発者が行ったことは、存在するオブジェクト参照によって参照されるダミー値(new Object())を渡すことです。
だから、実際にあなたがhashsetのようなHashSetに行を追加しているときhashset。add(3)javaが内部的に行うことは、その要素EをHashMap(HashSetオブジェクトの作成中に作成された)のキーとしてここに配置し、オブジェクトのオブジェクトであるダミー値が値としてキーに渡されるということです。HashMap put(Key k,Value V)メソッドのコードが表示されると、次のようなものが見つかります
public V put(k key,V value){
//Some code
}
上記のコードで注意すべき主な点は、put(key,value)が
1を返 キーが一意でマップ
2に追加された場合、null。 キーの古い値は、キーが重複している場合
だから、HashSet add()メソッドで、我々はmapの戻り値をチェックします。null値
を持つput(key,value)メソッド、つまり
public boolean add(E e){
return map。put(e,PRESENT)==null;