Как default.equals и .hashCode будут работать для моих классов?

Скажем, у меня есть собственный класс

public class MyObj { /* ... */ }

Он имеет некоторые атрибуты и методы. Он НЕ реализует equals, НЕ реализует hashCode.

Как только мы вызываем equals и hashCode, каковы реализации по умолчанию? Из класса Object? И что это? Как будут использоваться равные по умолчанию значения? Как будет работать hashCode по умолчанию и что будет возвращено? == будет просто проверять, ссылаются ли они на один и тот же объект, так что это легко, но как насчет методов equals() и hashCode()?

Ответ 1

Да, реализацией по умолчанию является Object (вообще говоря, если вы наследуете класс, который переопределяет equals и/или hashCode, тогда вы будете использовать эту реализацию вместо этого).

Из документации:

equals

Метод equals для класса Object реализует наиболее различающееся возможное отношение эквивалентности для объектов; то есть для любых непустых опорных значений x и y этот метод возвращает true тогда и только тогда, когда x и y относятся к одному и тому же объекту (x == y имеет значение true).

hashCode

Насколько разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это выполняется путем преобразования внутреннего адреса объекта в целое число, но этот способ реализации не требуется языком программирования JavaTM.)

Ответ 2

От Object в одной из реализаций JVM:

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

В обоих случаях он просто сравнивает адреса памяти этих объектов.

Ответ 3

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

Для получения дополнительной информации см. Эффективная Java, Глава 3 (pdf), пункт 8.

Ответ 4

Да, из класса Object, так как ваш класс расширяет объект неявно. equals просто возвращает this == obj. hashCode реализация является родной. Просто догадка - он возвращает указатель на объект.

Ответ 5

Если вы не предоставите свою собственную реализацию, будет использоваться один из объекта Object. Все в порядке, если вы не планируете вводить экземпляры класса в i.e HashSet (любая коллекция, которая фактически использует hashCode()), или что-то, что необходимо для проверки равенства объектов (т.е. Метода HashSet contains()). В противном случае он будет работать некорректно, если это то, о чем вы просите.

Очень легко обеспечить собственную реализацию этих методов благодаря HashCodeBuilder и EqualsBuilder из Apache Commons Lang.

Ответ 6

IBM developerworks говорит:

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

Однако, чтобы быть уверенными в точных деталях реализации конкретной версии Java поставщика, лучше всего смотреть в качестве источника (если он доступен)