2012-02-17 1 views
7

Он появляется в java.lang.String.java, что Java будет генерировать только хэш-код, а затем сохранить его после вызова hashcode(), но почему бы просто не сделать hashcode в конструкторе?Почему хэш-код Java String генерируется lazy?

Соответствующий код:

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

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

+0

Если вы найдете приемлемый ответ, вы можете отметить его, чтобы люди знали, что у вас есть ответ на ваш вопрос. –

ответ

13

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

+0

Многие строки получат проверку на равенство в своей жизни. Проверка двух неравных строк для равенства, если их хэш-коды были вычислены, как правило, очень быстро. Кроме того, для некоторых реализаций hashcode, в том числе и в Java, можно вычислить хэш-код для конкатенации двух строк в постоянное время (фактически время O (lgN), но это количество ограничено, а постоянный член может быть довольно небольшим). – supercat

0

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

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

4

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

Джереми Мэнсон имеет превосходное объяснение того, почему это делается и почему it'safe: on his blog

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

0

2 причины:

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

и:

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^