0

次のコードを実行しました

public class MapTest {    
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put(null, null);
        System.out.println(map.get(null));
        System.out.println(map.containsKey(null));
        System.out.println(map.containsValue(null));
    }
}

そして、それはこの出力を与えました

null
true
true

ただし、行を削除するとmap.put(null, null)map.get(null)まだnullが返されますが、map.containsKey(null)&はmap.containsValue(null)返されfalseます。では、値nullがどのキーにも関連付けられていない場合map.get(null)でも、なぜそれが返される可能性があるのnullでしょうか?

4

5 に答える 5

2

Mapインターフェースの Javadoc には、マッピングを持たないキーに対してget返す必要があると記載されています。null

指定されたキーがマップされている値を返します。このマップにキーのマッピングが含まれていない場合は null を返します。

ただし、一部のMap実装ではnullキーが許可されない場合があることに注意してください。その場合map.get(null)NullPointerException. この例は、ConcurrentHashMap.

于 2013-07-14T09:16:33.447 に答える
0

ここには奇妙な振る舞いはありません。Mapは、Java コレクション フレームワークのインターフェイスであり、HashMap実装されています。

単にマップは、キーと値のペアを格納できるデータ構造です。

ここでは、null をキーとして、null を値として設定しています。デフォルトHashMap<String,Integer>Stringはです。Integersnull

それからあなたは呼んでいます

map.get(null) // 引数はキーであり、戻り値はそのキーに割り当てられます。だからあなたはヌルになっています。

map.containsKey(null)// 特定のキーが存在する場合、このメソッドは true を返します。この場合、return true であるため、null がキーになります。この場合もそうです。

マップが空で、整数のデフォルト値がnullであるため、次回はnullになります。マップが空であるため、明らかに他の2つのメソッドはfalseを返します。

于 2013-07-14T10:04:09.477 に答える
0

以下は、HashMap の get() ソース コードの例外です。

public V get(Object key) {
   if (key == null)
     return getForNullKey();
   ...
}

渡されたキーが の場合、そのキーnullを取得してそれに関連付けられた値を返します。それ以外の場合は null を返します。

 private V getForNullKey() {
     for (Entry<K,V> e = table[0]; e != null; e = e.next) {
         if (e.key == null)
            return e.value;
     }
     return null;
 }
于 2013-07-14T09:23:44.523 に答える
0

マップで値が見つからない場合get(object)でも、 を返しますnull

したがって、任意の値に対しても null が返されます。

于 2013-07-14T09:16:49.623 に答える