/ / Java String buforowanie kodu - java, string, hashcode

Buforowanie kodu ciągów Java - java, string, hashcode

Jedną z zalet niezmienności ciągów jest buforowanie hashcode dla szybszego dostępu.

  • W tym przypadku, w jaki sposób bufor jest obsługiwany dla łańcucha, który ma ten sam kod hash?
  • Czy to naprawdę poprawia wydajność w tym przypadku?

Odpowiedzi:

4 dla odpowiedzi № 1

W tym przypadku, w jaki sposób bufor jest obsługiwany dla łańcucha, który ma ten sam kod hash?

Nie rozumiem pierwszej części twojegopytanie. Pamięć podręczna jest obsługiwana dla wszystkich ciągów tak samo, niezależnie od tego, czy kody skrótu są takie same czy nie (ponieważ dwa różne ciągi mogą teoretycznie mieć ten sam kod hash, a więc jeśli kody hash są równe, nie oznacza to, że ciągi są równe). ten sam ciąg obiekt jest używany, kod hash nie musi być ponownie obliczany, ponieważ jest buforowany.

Czy to naprawdę poprawia wydajność?

Jednoznacznie TAK


7 dla odpowiedzi nr 2

W tym przypadku, w jaki sposób bufor jest obsługiwany dla łańcucha, który ma ten sam kod hash?

Buforowany jest kod hash łańcucha. Jest buforowany w prywatnym int pole w samym ciągu. Nie ma znaczenia, że ​​różne ciągi mogą mieć ten sam kod hash ... ponieważ kod hash jest przechowywany w odpowiednich obiektach String.

(Najważniejszą rzeczą jest to, że dwa ciągi mają tę samą sekwencję znaków (a więc są equal) mają tę samą wartość hashcode. I to jest gwarantowane, ponieważ algorytm hashcode dla ciągów Java jest znormalizowany ... i ma tę właściwość.)

Czy to naprawdę poprawia wydajność w tym przypadku?

Średnio tak, a tym bardziej, gdy długości sznurków stają się większe.

Przyzwoity algorytm hashcode napisów musi wyglądaćprzy każdym znaku w łańcuchu ... w przeciwnym razie podobne ciągi mogą kończyć się systematycznym odwzorowywaniem na ten sam kod hash (czyli BAD). Unikanie wielokrotnego oglądania tych N postaci to duża wygrana.

Jedynymi znaczącymi przypadkami, w których buforowanie nie pomogłoby, byłyby:

  • gdy większość hashcodes ciągów jest używana tylko raz, lub
  • kiedy większość strun jest naprawdę krótka.

(Jest jeszcze jedna bardzo niejasna sprawa. Jeśli a String hashe to 0, a następnie buforowanie będzie nieskuteczne. To dlatego, że String zastosowania klasowe 0 w polu pamięci podręcznej, aby powiedzieć, że kod hash nie został buforowany.


2 dla odpowiedzi nr 3

Pamięć podręczna jest tylko polem int w obiekcie String. Wiele ciągów znaków może mieć ten sam kod hash bez problemu.

Znacznie pomaga to osiągnąć wydajność, ponieważ:

  • Obliczanie hashcode jest znacznie droższe niż odczyt pojedynczego pola int
  • Jeśli raz obliczysz kod hash ciągu, prawdopodobnie będziesz chciał obliczyć kod hash ciągu jeszcze wiele razy (np. Jest używany w kluczu hashap)

Jeśli jesteś zainteresowany, warto przyjrzeć się źródłu:

http://www.docjar.com/html/api/java/lang/String.java.html


1 dla odpowiedzi nr 4

W większości przypadków kod hash nie jest obliczany, dopóki nie spróbujesz umieścić ciągu znaków w mapie HashMap. Mapa i tak buforuje ją w Map.Entry, aby przyspieszyć porównania i ponowne odświeżanie.


-1 dla odpowiedzi № 5

Dla pierwszego zależy to od skrótustrategia. Na przykład, jeśli dodasz cały kod ascii liter słowa razem dla kodu skrótu tej litery (65 dla a i 97 dla A), w tej sytuacji słowo „abc” i „bca” ma ten sam kod skrótu .

W drugim przypadku zależy to również od strategii mieszania, ale w większości sytuacji odpowiedź brzmi TAK.