java - реализация - Использовать Objects.hash() или собственную реализацию hashCode()?




objects.hash java (2)

Недавно я обнаружил метод Objects.hash() .

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

@Override
//traditional
public int hashCode() {
    int hash = 5;
    hash = 67 * hash + (int)(this.id ^ (this.id >>> 32));
    hash = 67 * hash + (int)(this.timestamp ^ (this.timestamp >>> 32));
    hash = 67 * hash + Objects.hashCode(this.severity);
    hash = 67 * hash + Objects.hashCode(this.thread);
    hash = 67 * hash + Objects.hashCode(this.classPath);
    hash = 67 * hash + Objects.hashCode(this.message);
    return hash;
}

@Override
//lazy
public int hashCode() {
    return Objects.hash(id, timestamp, severity, thread, classPath, message);
}

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

Есть ли недостатки использования Objects.hash() по сравнению с реализацией собственного хеш-кода? Когда я выберу каждый из этих подходов?

Обновить

Хотя эта тема отмечена как разрешенная, не стесняйтесь оставлять сообщения ответов, которые предоставляют новую информацию и проблемы.


Ниже приведена реализация Objects.hash - которая внутренне вызывает Arrays.hashCode.

public static int hash(Object... values) {
    return Arrays.hashCode(values);
}

Это реализация метода Arrays.hashCode

public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;

    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}

Поэтому я согласен с @Andy. Стоимость создания этих «ненужных» объектов может складываться, если часто вызывается hashCode. Если вы реализуете себя, это будет быстрее.


Обратите внимание, что параметр Objects.hash - Object... Это имеет два основных последствия:

  • Примитивные значения, используемые в вычислении хэш-кода, должны быть помещены в бокс, например this.id преобразуется из long в Long .
  • Для вызова метода необходимо создать Object[] .

Стоимость создания этих «ненужных» объектов может складываться при частом вызове hashCode .







hash