2015-02-10 9 views
5

W następnym kawałku kodu:Czy funkcja Map.containsKey() jest przydatna w mapie, która nie ma zerowych wartości?

if (map.containsKey(key)) { 
    map.remove(key); 
} 

Patrząc na wydajność, to jest przydatne, aby najpierw zrobić test Map.containsKey() przed próbą usunięcia wartości z mapy?

To samo pytanie dotyczy pobierania wartości, czy warto najpierw sprawdzić zawartość, jeśli wiadomo, że mapa nie zawiera wartości null?

if (map.containsKey(key)) { 
    Object value = map.get(key); 
} 
+1

Pierwszy przykład jest zbędny nawet w obecności pustych klawiszy. –

+0

Jakie implementacje JDK? – aioobe

Odpowiedz

4

remove powraca null jeśli nie ma odwzorowania dla key nie zostanie wyrzucony wyjątek:

public V remove(Object key) 

Nie widzę żadnego powodu, aby wykonać tę if przed próbą usunięcia key, być może, jeśli chcesz policz ile elementów zostało usuniętych z mapy ..

W drugim przykładzie otrzymasz null, jeśli key nie istnieje. To, czy sprawdzić, czy nie, zależy od twojej logiki.

nie próbować trać czasu na myślenie o wydajności containsKey ma O(1) time complexity:

Ta implementacja zapewnia stały etat wydajność dla podstawowych operacji (get i put)

3

jest przydatna najpierw zrobić Map.containsKey() sprawdzić przed próbą usunięcia wartości z mapy?

Nie, to jest odwrotne:

  • W przypadku, gdy przedmiot nie istnieje, to nie widać różnicy
  • W przypadku, gdy towar jest tam, by skończyć z dwa wyszukiwania.

Jeśli chcesz usunąć produkt bezwarunkowo, po prostu zadzwoń pod numer map.remove(key).

samo pytanie odnosi się do pobierania wartości

sama logika dotyczy tutaj. Oczywiście musisz sprawdzić wynik dla null, więc w tym przypadku pozostaje tam if.

Należy pamiętać, że to ćwiczenie porządkowe dotyczy przede wszystkim czytelności, a dopiero potem wydajności. Uzyskanie dostępu do mapy jest szybką operacją, więc uzyskanie dostępu do niej dwukrotnie raczej nie spowoduje większych problemów z wydajnością, z wyjątkiem niektórych ekstremalnych przypadków. Jednak usunięcie dodatkowego warunku sprawi, że Twój kod będzie bardziej czytelny, co jest bardzo ważne.

0

Dokumentacja Java na remove() stwierdza, że ​​usunie element tylko wtedy, gdy mapa zawiera taki element. Tak więc kontrola przed remove() jest zbędna.

0

Jest to subiektywne (i całkowicie przypadek stylu), ale w przypadku, gdy pobierasz wartość, preferuję wywołanie contains(key) do sprawdzania zerowego. Porównania boolowskie są po prostu lepsze niż porównania zerowe. Prawdopodobnie poczułbym się inaczej, gdyby Map<K,V>.get(key) zwrócił .

Warto również zauważyć, że asercja "given no null keys" to taka, która może być dość trudna do udowodnienia, w zależności od rodzaju mapy (której możesz nawet nie znać). Ogólnie uważam, że nadmiarowa kontrola pobierania jest bezpieczniejsza (a może po prostu czuje się), na wypadek, gdyby w innym miejscu był błąd (puka do drewna, sprawdza czarne koty i unika drabiny po drodze).

Do operacji usuwania jesteś na miejscu. Czek jest bezużyteczny.

Powiązane problemy