Почему хеш-код Java String генерируется ленивым? - PullRequest
7 голосов
/ 17 февраля 2012

В 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;
}

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

Ответы [ 5 ]

13 голосов
/ 17 февраля 2012

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

4 голосов
/ 17 февраля 2012

Джошуа Блох назвал эту практику «колоритной одиночной проверкой».

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

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

0 голосов
/ 17 февраля 2012

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

0 голосов
/ 17 февраля 2012

2 причины:

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

и

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

0 голосов
/ 17 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...