Как 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 поставщика, лучше всего смотреть в качестве источника (если он доступен)