2013-02-09 13 views
8

W Javie, mający HashMap całkowicie wypełnione danymi takiej postaci:Sprawdź istnienie HashMap kluczy

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1); 

co jest szybsze przy sprawdzaniu istnienia klucza losowego, powiedzmy 100:

if (map.get(100) == null)) 

lub

if (!map.containsKey(100)) 

?

Pytanie jest interesujące z punktu widzenia mikrooptymalizacji.

+0

Dlaczego go nie przetestujesz? – rekire

+0

Zrobiłem, ale daje to cały czas różne czasy wykonania, które są w pewnym przedziale i mniej więcej tym samym. Nie mam pojęcia, co jest naprawdę szybsze. –

Odpowiedz

15

containsKey powinny być bardzo nieznacznie wolniej, ponieważ skutkuje dodatkowym wywołania funkcji (to właśnie nazywa getEntry) (można go uzyskać zoptymalizowane z dala, nie jestem pewien, czy Java zrobić). containsKey wygląda następująco:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 

Należy jednak pamiętać, że containsKey mógłby natomiast być bardzo nieznacznie szybciej innych Map wdrożeń (ale prawdopodobnie nie tych w standardowym API Java).

Ogólnie moje implementacje wyglądać następująco: (unikając potrzeby containsKey)

int[] arr = map.get(100); 
if (arr == null) // doesn't exist 
    // do stuff 
else // exists 
    // do stuff with arr 

Poniższa byłoby zdecydowanie być wolniejsze niż powyżej: (jeżeli rzeczy zwracać uwagę istnieć odpowiednią ilość czasu)

if (!map.containsKey(100)) // doesn't exist 
    // do stuff 
else // exists 
{ 
    int[] arr = map.get(100); 
    // do stuff with arr 
} 

Edit: Dzięki zvzdhk za dostarczenie źródła containsKey. Powinienem był to sprawdzić.

5

W rzeczywistości oba podejścia są takie same. Jeśli spojrzeć w java.util.HashMap kodu źródłowego można znaleźć następną containsKey realizacji:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 
+1

Cóż, @downvoter, popraw mnie, jeśli się mylę. – bsiamionau

2

Dwaj różni się tylko return typ oprócz tego map.get(key) może powrót null w przypadku jeśli jego klucza, jednak map.containsKey(key) zwróci Ci boolean które mogłyby może posłużyć do wyprowadzenia dwóch możliwych przypadków: map.get(key) zwrócenia null.

1

Nie ma różnicy między tymi dwoma podejściami. Główna różnica tylko to, co masz zamiar zrobić dalej. Jeśli potrzebujesz wartości wtedy, oczywiście, uzyskasz wartość.