Ленивая инициализация хеш-кода в Java - PullRequest
0 голосов
/ 14 ноября 2018

Почему мы говорим, что неизменяемые объекты используют ленивую инициализацию хеш-кода?Для изменяемых объектов мы также можем вычислять хеш-код только тогда, когда это необходимо, что вызывает ленивую инициализацию?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

class FinalObject {
    private final int a, b;
    public FinalObject(int value1, int value2) {
        a = value1;
        b = value2;
    }

    // not calculated at the beginning - lazy once required
    private int hashCode;
    @Override
    public int hashCode() {
        int h = hashCode; // read
        if (h == 0) {
            h = a + b;    // calculation
            hashCode = h; // write
        }
        return h;         // return local variable instead of second read
    }
}
0 голосов
/ 14 ноября 2018

Для изменяемых классов обычно не имеет особого смысла хранить hashCode, так как вам придется обновлять его каждый раз, когда изменяется объект (или, по крайней мере, обнулять его, чтобы вы могли пересчитать его в следующий раз hashCode() называется).

Для неизменяемых классов имеет смысл сохранять хеш-код - после его вычисления он никогда не изменится (поскольку объект неизменен), и нет необходимости постоянно пересчитывать каждый раз, когда hashCode() называется. В качестве дальнейшей оптимизации мы можем избежать вычисления этого значения до тех пор, пока оно не понадобится в первый раз (т.е. вызывается hashCode()), т. Е. Использовать ленивую инициализацию.

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

...