2012-02-17 16 views
7

Pojawia się w java.lang.String.java, że ​​Java generuje tylko kod skrótu, a następnie przechowuje go, po wywołaniu hashcode(), ale dlaczego nie po prostu dokonać haszowania w konstruktorze?Dlaczego jest generowany leniwy łańcuch Java String?

Odpowiedni kod:

if (h == 0 && count > 0) { 
    int off = offset; 
    char val[] = value; 
    int len = count; 

    for (int i = 0; i < len; i++) { 
     h = 31*h + val[off++]; 
    } 

    hash = h; 
} 

mogłyby w przeważającej części zostać umieszczone w konstruktorze.

+0

Jeśli znajdziesz akceptowalną odpowiedź, możesz ją zaznaczyć, aby inni wiedzieli, że masz odpowiedź na swoje pytanie. –

Odpowiedz

13

Po co tracić czas na generowanie kodu skrótu, który najprawdopodobniej nie będzie używany? Większość łańcuchów jest konstruowanych, używanych, a następnie wyrzucanych do śmieci bez wywoływania funkcji hashcode().

+0

Wiele ciągów zostanie sprawdzonych pod kątem równości w ich życiu. Sprawdzanie dwóch nierównych łańcuchów dla równości, jeśli ich kody skrótu zostały obliczone, jest generalnie bardzo szybkie. Co więcej, w przypadku niektórych implementacji hashcode, w tym w języku Java, możliwe jest obliczenie kodu kreskowego dla konkatenacji dwóch ciągów znaków w stałym czasie (w rzeczywistości czas O (lgN), ale ta wielkość jest ograniczona, a stała wartość może być dość mała). – supercat

0

To naprawdę nie jest właściwe forum, a pytanie zostanie prawdopodobnie zamknięte. Możesz spróbować zapytać w programmers.stackexchange.com.

Jednym z powodów może być to, że obliczanie hashCode nie jest tanie i jest wymagane tylko w niektórych przypadkach.

4

Joshua Bloch nazwać tę praktykę "rasistowskim jednym sprawdzeniem".

Jeremy Manson ma doskonałe wyjaśnienie, dlaczego to zrobił i dlaczego it'safe: on his blog

W istocie, w czasie budowy zaoszczędzić trochę czasu omijając obliczania kod skrótu. W środowisku wielowątkowym zapłacisz za to, ponieważ wiele wątków potencjalnie może wykonać te same obliczenia.

0

2 powodów:

1) Computing hashCode() nie jest tani: jest O(n) złożoność od długości napisu, więc lepiej to zrobić tylko wtedy, gdy jest to potrzebne.

oraz:

2) przypadki, String są niezmienne: Ponieważ nigdy nie zmieni, zawsze obliczyć hashCode() co najwyżej jeden raz.

0

Nie ma żadnych korzyści podczas umieszczania go w konstruktorze. Ale w konstruktorze jest minus. Kiedy hashCode dla String nigdy nie jest wywoływane, to obliczenia zostały wykonane za darmo. A kiedy wywołujesz hashCode(), to jest obliczana raz w obu przypadkach - tylko w różnych miejscach i czasie.

Powiązane problemy