переменная "hash" в классе String - PullRequest
2 голосов
/ 17 октября 2019

что такое использование частной переменной "хэш" в классе java.lang.String. Он является частным и вычисляется / пересчитывается каждый раз, когда вызывается метод хэш-кода.

http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java

1 Ответ

2 голосов
/ 17 октября 2019

Используется для кэширования hashCode из String. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

В коде, который вы разместили, он только пересчитывается, только когда значениеhash равно 0, что может произойти, если hashCode еще не было вычислено или , если hashCode из String на самом деле 0, что возможно!

Например, hashCode из "aardvark polycyclic bitmap" равно 0.

Кажется, что этот упущение было исправлено в Java 13 с введением поля hashIsZero:

public int hashCode() {
    // The hash or hashIsZero fields are subject to a benign data race,
    // making it crucial to ensure that any observable result of the
    // calculation in this method stays correct under any possible read of
    // these fields. Necessary restrictions to allow this to be correct
    // without explicit memory fences or similar concurrency primitives is
    // that we can ever only write to one of these two fields for a given
    // String instance, and that the computation is idempotent and derived
    // from immutable state
    int h = hash;
    if (h == 0 && !hashIsZero) {
        h = isLatin1() ? StringLatin1.hashCode(value)
                       : StringUTF16.hashCode(value);
        if (h == 0) {
            hashIsZero = true;
        } else {
            hash = h;
        }
    }
    return h;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...