Если вы класс переопределяет метод hashcode и equals, используются переопределенные методы или методы по умолчанию, используемые в классе Object. Но и хэш равно используются в HashSets, HashMaps и т.д.
поведение по умолчанию вы можете обратиться к doc
равна метод класса Object реализует самые взыскательные возможное отношение эквивалентности на объектах; то есть, для любых ненулевых эталонных значений х и у, этот метод возвращает истину, если и только если х и у относятся к одному объекту (х == у имеет значение истина)
Как много как это практически целесообразно, метод hashCode, определенный Класс Object возвращает разные целые числа для разных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализация не требует языка программирования JavaTM.)
Добавление как это найти дубликаты:
Давайте сначала рассмотрим хеширование:
Хеширование используется для быстрого извлечения данных. В основном хеш-функция генерирует значение индекса (это значение индекса обычно относится к ведру, который может хранить объекты), как только это значение индекса генерируется, он ищет этот объект внутри этого конкретного ведра.
я хотел бы предложить вам посмотреть в хэширования раз
Hashing Wiki
Всякий раз, когда мы добавим к HashSet, используется метод хэш-код, он возвращает значение индекса, объект сохраняется в этом ведре (ведро соответствующий этому индексу)., когда снова добавляется тот же объект, значение hashcode будет таким же, поэтому оно относится к одному и тому же ведру, теперь, поскольку объект уже присутствует (здесь равен метод используется для проверки равенства между объектами) в этом ковше, это не добавил снова
class Data {
public Data(String name) {
super();
this.name = name;
}
String name;
}
public class ReadFromFile {
public static void main(String[] args) throws IOException {
Data s = new Data("yo");
HashSet<Data> set = new HashSet<>();
set.add(new Data("hi"));// hi
set.add(new Data("hi"));// hi but has a different address because a new
// object is created
System.out.println("Size before adding s " + set.size());
set.add(s);
set.add(s);// because same object is being added, default hashcode
// generates same value, as it uses address to generate
// hashcode
System.out.println("Size after adding s " + set.size());
}
}
выход
Размер, прежде чем добавить с 2
Размер после добавления 3 с
он не должен и никогда, если он не найдет 'hashcode и equals' –
как насчет класса' SomeObject'? это переопределить метод? –
Концептуально это не должно. Означает ли это, что это обналичивание значений и использование одного и того же объекта, если у него есть множественное refrence. – Minion