Вопрос

В 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(), то он вычисляется один раз в обоих случаях - просто в разных местах и в разное время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top