12

Java APIでは、HashSetの実装は、HashMap内の値としてオブジェクトを使用しています。

   // Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

ただし、HashMapではその値をnullにすることができます。値を埋めるのにそれは必要ないと思うのに、なぜこれが必要なのですか?

4

6 に答える 6

16

HashSetコントラクトは、指定されたオブジェクトが存在し、削除された場合にそのremove()リターンを指定しているためです。trueこれを行うためにHashMap#remove()、削除された値を返すwrappedを使用します。

nullオブジェクトの代わりに保存すると、への呼び出しHashMap#remove()が返さnullれます。これは、存在しないオブジェクトを削除しようとした結果と区別がつかず、のコントラクトをHashSet.remove()実行できませんでした。

于 2012-10-10T22:10:12.273 に答える
6

しかし、HashMapはその値がnullであることを許可します

値が完全に制御されているのに、なぜそれが問題になるのでしょうHashSetか。これにより、キーに関連付けられた唯一の値が。になりPRESENTます。したがって、map.putが返された場合null、それは以前にそのキーのエントリがなかったためにのみ発生する可能性があります。

いくつかの値を指定する必要があるため、値はそこにあります。値として指定された場合null、それは悪いことです。を呼び出す前に値があったかどうかを判断するのが難しくなりますadd。null以外の値を指定する場合は、常に同じ値にすることをお勧めします。たとえば、ガベージコレクションを保持したくない場合があります。

さて、値をまったく記録しないより効率的な実装ではなく、なぜHashSet実装されているのかを尋ねるなら、それは別の質問であり、私には答えがありません。HashMap

于 2012-10-10T22:10:05.873 に答える
0

Java HashMapでは、オブジェクトからnullへのマッピングは、オブジェクトがマップにまったく存在しないことと同じではありません。検討:

Object exists = new Object();
map.put(exists, null);
System.out.println(map.contains(exists)) // "true"
System.out.println(map.get(exists)) // "null"
Object notMapped = new Object();
System.out.println(map.contains(notMapped)) // "false"
System.out.println(map.get(notMapped)) // "null"

また、HashMap.put()は、入力したキーを含む古い値を返します。この場合、nullです(そのキーがマップになかったか、その値がnullだったため)。

于 2012-10-10T22:10:51.270 に答える
0

を使用するMapと、を呼び出すとput(key, null)、違いがわかりません

  1. キーはすでに存在し、にマッピングされますnull
  2. そのキーのマッピングはありませんでした

はに委任するので、HashSetのコントラクトを実行する必要があります。これは、オブジェクトが:にすでに存在する場合に返されます。addHashMap.putPRESENTSet.addfalseSet

return map.put(e, PRESENT)==null; 
于 2012-10-10T22:12:19.147 に答える
0

もう1つ追加したい:

として、HashSet add()メソッドは次のように機能します。

public boolean add(E e){

    return map.put(e, PRESENT)==null;
}
  1. PRESENT == nullの場合、最初にHashMapにアイテムを追加すると、null値が返されるとします。

    オブジェクトが存在する=newObject();

            V  value=  map.put(exists,null);
                value will be null here
    

    HashSetは->null==null->>trueを返します

  2. Nullとして値を持つhashMapに同じキーを追加する2回目

     map.put(exists,null);
    

    return null == null->> trueこれにより、hashSetでの重複が許可されます。そのため、JDK開発者はPRESENTオブジェクトを作成します。

于 2018-05-17T03:56:38.653 に答える
-1

パーツに注意して==nullください..............。

于 2012-10-10T22:11:41.773 に答える