Почему хэш-код строки Java генерируется лениво?

он появляется в java.ленг.Строка.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;
}

по большей части может быть помещен в конструктор.

5 ответов


зачем тратить время на создание хэш-кода, который, скорее всего, не будет использоваться? Большинство строк строятся, используются, а затем собирают мусор без вызова hashcode ().


Джошуа блох называет эту практику "пикантной однократной проверкой".

у Джереми Мэнсона есть отличное объяснение, почему это делается и почему это безопасно:в своем блоге

по сути, во время строительства вы экономите время, пропуская расчет хэш-кода. В многопоточной среде вы заплатите за это, потому что несколько потоков потенциально могут выполнить один и тот же расчет.


Это не совсем правильный форум для этого и вопрос скорее всего будет закрыт. Вы можете попробовать спросить в programmers.stackexchange.com.

одной из причин может быть то, что вычисление хэш-кода не дешево и требуется только в некоторых случаях.


2 причинам:

1) вычисления hashCode() не дешево: является O(n) сложность по длине строки, поэтому лучше делать это только при необходимости.

и:

2) экземпляры строк неизменяемы: поскольку они никогда не меняются, вы всегда вычисляете hashCode() не более одного раза.


нет никакой пользы при размещении его в конструкторе. Но есть и обратная сторона, когда это будет в конструкторе. Когда хэш-код для строки никогда не вызывается, вычисление было сделано зря. И когда вы вызываете hashCode (), то он вычисляется один раз в обоих случаях - только в разных местах и времени.