Я посмотрел какой-то код и нашел одну программу, в которой они расширили класс коллекции HashSet. Они создали пользовательские объекты сотрудников и вставили их в Set без реализации Comparable или Comparator. Они реализовали логику для идентификации дублирующего объекта сотрудника, поэтому, если объект уже существует, они могут выполнить операцию обновления, если объект отсутствует, они могут выполнить операцию вставки. Я пытался понять, как set будет идентифицировать дублированный объект без реализации интерфейса Comparable или Comparator.
Я попробовал то же самое, а также попытался переопределить Hashcode и метод equals, чтобы понять, как установить сравнение объектов. Одна вещь, которую я обнаружил, это то, что я добавляю один и тот же объект для установки его генерации того же Hashcode Но он не вызывает метод equals, который я переопределил.
class Employee {
int id;
String name;
Employee(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
System.out.println("HashCode : " + super.hashCode());
return super.hashCode();
}
@Override
public boolean equals(Object o) {
System.out.println("Equals : " + super.equals(o));
return super.equals(o);
}
}
class LimitedHashSet extends HashSet<Employee> {
public boolean add(Employee e) {
if(!super.add(e)){
return false;
}
return true;
}
}
public class ExtendingHashSet {
public static void main (String[] args) {
Employee e0 = new Employee(1,"A");
Employee e1 = new Employee(2,"B");
LimitedHashSet obj = new LimitedHashSet();
System.out.println("Element added ? " + obj.add(e0) + "\n");
System.out.println("Element added ? " + obj.add(e1) + "\n");
System.out.println("Element added ? " + obj.add(e0) + "\n");
}
}
Хэш-код используется для вычисления сегмента, а метод equals определяет его равные или нет. Так как это работает здесь. Пожалуйста, проверьте вывод ниже.
Выход:
HashCode: 914424520
Элемент добавлен? правда
HashCode: 110718392
Элемент добавлен? правда
HashCode: 914424520
Элемент добавлен? ложь