Почему хэш-код строки Java генерируется лениво?
-
26-10-2019 - |
Вопрос
В java.lang.String.java указано, что Java только сгенерирует хэш-код, а затем сохранит его после вызова hashcode(), но почему бы просто не создать хэш-код в конструкторе?
Соответствующий код:
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;
}
по большей части может быть помещен в конструктор.
Решение
Зачем тратить время на создание хэш -кода, который, скорее всего, не будет использоваться? Большинство струн строится, используются, а затем мусор, собранные без HashCode (), когда -либо называемого.
Другие советы
Джошуа Блох называет эту практику «Racy Single-Check».
У Джереми Мэнсона отличное объяснение того, почему это сделано и почему это так: в его блоге
По сути, во время строительства вы сэкономите время, пропустив расчетный хэш -код. В многопоточной среде вы заплатите за это обратно, потому что несколько потоков, потенциально, могут сделать один и тот же расчет.
Это не совсем правильный форум для этого, и вопрос, вероятно, будет закрыт. Вы можете попробовать спросить у программистов.stackexchange.com.
Одной из причин может быть то, что вычисление хэшкода не является дешевой и требуется только в некоторых случаях.
2 причины:
1) Вычисление hashCode()
не дешево: это O(n)
Сложность на длине строки, так что лучше, сделайте это только тогда, когда это нужно.
а также:
2) Строковые экземпляры неизменны: поскольку они никогда не меняются, вы всегда вычисляете hashCode()
больше всего один раз.
Нет никакой пользы при размещении его в конструкторе.Но есть и обратная сторона, когда это будет находиться в конструкторе.Когда хэш-код для строки никогда не вызывается, значит, вычисление было выполнено впустую.И когда вы вызываете hashCode(), то он вычисляется один раз в обоих случаях - просто в разных местах и в разное время.