2015-04-27 8 views
9

Patrząc na implementację hashmap java, nie jest w stanie zrozumieć przyczyny niektórych linii. W poniższym kodzie skopiowanym z here, w linii 365-367, nie jestem w stanie zrozumieć, dlaczego dokonali przypisania e.key do k, a następnie porównali == klawiszem [(k = e.key) == ]. Dlaczego nie zrobić bezpośrednio (klucz e.key ==). Ten wzór pojawia się kilka razy w kodzie.w kluczu implementacji java ishmap jest najpierw przypisany do obiektu, a następnie porównywany

359 
360  final Entry<K,V> getEntry(Object key) { 
361   int hash = (key == null) ? 0 : hash(key.hashCode()); 
362   for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
363    e != null; 
364    e = e.next) { 
365    Object k; 
366    if (e.hash == hash && 
367     ((k = e.key) == key || (key != null && key.equals(k)))) 
368     return e; 
369   } 
370   return null; 
371  } 
+0

Używają one wartości k w drugiej części warunku, ale mogli napisać '(e.key == key || (key! = Null && key.equals (e.key))) 'zamiast tego i wyeliminował zmienną' k'. Nie widzę korzyści z wprowadzenia tej zmiennej lokalnej. – Eran

+0

Dokładnie, ale w wielu podobnych sytuacjach w całym kodzie religijnie podążali za tworzeniem nowej zmiennej lokalnej. – Nitiraj

+4

Zobacz http://stackoverflow.com/questions/10180656/why-is-lock-captured-to-a-local-variable, http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy- zmienna final-member-field-into-local-final, http://stackoverflow.com/questions/28975415/why-jdk-code-style-uses-a-variable-assignment-and-read-on-the- same-line-eg-i ... – Marco13

Odpowiedz

2

Jest to prawdopodobnie kwestia optymalizacji. Wywołanie e.key dodaje poziom dwukierunkowości (jak użyć odniesienia na e, aby uzyskać odniesienie na key). Zmienna k pozwala na użycie skrótu do e.key i pozwala uniknąć dwukrotnego użycia tego niepotrzebnego dwukierunku. Implementacja również bezpośrednio wykorzystuje wynik przypisania k = e.key zamiast przypisywania wartości do k, a następnie porównywania k z key.

Nie wiem, czy wpływ takiej optymalizacji jest znaczący (przypisanie nowej zmiennej kontra pośredni dostęp). Prawdopodobnie jest to trudne do oszacowania i może zależeć od JVM (ponieważ różne maszyny JVM mogą wykonywać inną optymalizację kodu).

Ponieważ HashMap jest szeroko stosowany w Javie, myślę, że wdrożenie ma na celu zaoferowanie maksymalnej wydajności bez oczekiwanej optymalizacji ze środowiska wykonawczego; stąd powszechne stosowanie tego wzorca.

Powiązane problemy