Реализация по умолчанию equals()
выполняется в java.lang.Object:
public boolean equals(Object obj) {
return (this == obj);
}
Другой метод hashCode();
по умолчанию возвращает какую-то ссылку на объект. То есть оба уникальны по умолчанию. Equals возвращает true только для одного и того же объекта, hashCode () отличается для каждого объекта.
Это именно то, что может создать несколько записей. Вы можете создать 2 экземпляра вашего класса. С вашей точки зрения они равны, потому что содержат одинаковые данные. Но они разные. Итак, если вы используете эти объекты в качестве ключей карты, вы создаете 2 записи. Если вы хотите избежать этого, используйте equals и hashCode для вашего класса.
Эта реализация иногда очень многословна. HashCodeBuilder и EqualsBuilder из проекта Джакарта могут вам помочь. Вот пример:
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object other) {
return EqualsBuilder.reflectionEquals(this, other);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}