2012-06-04 15 views
5

Ok, oto fragment, którego nie rozumiem.
Przy próbie pobrania obiektu przy użyciu metody get() i zwróceniu wartości zerowej nadal możliwe jest przechowywanie null jako obiektu skojarzonego z kluczem podanym w metodzie get(). Możesz określić, czy tak jest, przekazując klucz obiektu do mapy dla metody containsKey(). Ten wraca true jeśli klucz jest przechowywany w mapie
Tak, jak jest containsKey() powinien mi powiedzieć, czy wartość związany z kluczem dostarczonym jest null?
To jest the reference jeśli chcesz sprawdzić. Page 553Zrozumienie HashMap <K,V>

Odpowiedz

4

Rozważmy prosty fragment kodu:

Map<String, String> m = new HashMap<String, String>(); 
m.put("key1", "value1"); 
m.put("key2", null); 

System.out.println("m.get(\"key1\")=" + m.get("key1")); 
System.out.println("m.containsKey(\"key1\")=" + m.containsKey("key1")); 

System.out.println("m.get(\"key2\")=" + m.get("key2")); 
System.out.println("m.containsKey(\"key2\")=" + m.containsKey("key2")); 

System.out.println("m.get(\"key3\")=" + m.get("key3")); 
System.out.println("m.containsKey(\"key3\")=" + m.containsKey("key3")); 

Jak widać kładę na mapie dwie wartości, z których jedna jest NULL. Thene poprosiłem mapę o trzy wartości: dwie z nich są obecne (jedna jest zerowa), jedna nie. Spójrz na wynik:

m.get("key1")=value1 
m.containsKey("key1")=true 
m.get("key2")=null 
m.containsKey("key2")=true 
m.get("key3")=null 
m.containsKey("key3")=false 

Drugi i trzeci to trudna część. key2 jest obecny z wartością pustą, więc przy użyciu get() nie można rozróżnić, czy element nie znajduje się na mapie, czy jest na mapie z wartością null. Ale używając containsKey() możesz, ponieważ zwraca ona boolean.

+0

W porządku, to wyjaśniło to poprawnie. W prawdziwym programowaniu, będę musiał najpierw użyć 'containsKey()', aby sprawdzić, czy klucz jest poprawny, a następnie wyświetlić wartość z nim powiązaną.Jeśli nie, to wyświetl komunikat lub wyślij wyjątek :) –

+0

@FasihKhatib, który jest naprawdę potrzebny, jeśli przechowujesz 'null's na mapie. Jeśli nigdy nie przechowujesz 'null' na mapie, nie ma większego sensu sprawdzanie poprawnych mapowań zerowych. –

9
Map<String, Object> map = new HashMap<String, Object>(); 
map.put("Foo", null); 
System.out.println(map.containsKey("Foo")); 
System.out.println(map.containsKey("Boo")); 

WYJŚCIE:

true 
false 

get() powraca null w dwóch przypadkach:

  • Klucz nie istnieje na mapie.
  • Klucz istnieje, ale powiązana z nim wartość to null.

Nie można stwierdzić z poziomu get(), które jest prawdziwe. Jednak containsKey() powie Ci, czy klucz był obecny na mapie, niezależnie od tego, czy powiązana z nim wartość to null.

+2

+1 - edytowane w celu wyjaśnienia –

+0

co jest prawie tym, co powiedziałem w poście powyżej. – FSP

+0

Tak, książka mówi, że ma pomóc mi sprawdzić, czy wartość V HashMap jest zerowa. –

1

containsKey powie Ci, czy klucz w ogóle jest w mapie. Rozważmy przypadek, w którym klucz jest obecny z wartością pustą, a drugi przypadek, w którym klucz, którego szukasz, w ogóle nie występuje w mapie mieszającej.

+0

+1 prawidłowa odpowiedź. –

3
(get() == null && containsKey()) == value is null 
Powiązane problemy