2015-09-23 3 views
0
public class Type extends SomeObject implements java.io.Serializable { 

    private Integer typeId; 

    private String typeName; 

    private String typeCode; 
} 

Я получаю данные из базы данных, используя спящий режим как объект типа. Теперь в моем классе нет (не его родительский класс) переопределить метод equals. SO, если я вставляю весь объект Type в hashset, он не должен удалять дубликаты, но он удаляет дубликат. Мой вопрос в том, как он может идентифицировать дубликаты?Как hashset удаляет повторяющиеся записи?

+1

он не должен и никогда, если он не найдет 'hashcode и equals' –

+0

как насчет класса' SomeObject'? это переопределить метод? –

+0

Концептуально это не должно. Означает ли это, что это обналичивание значений и использование одного и того же объекта, если у него есть множественное refrence. – Minion

ответ

3

Внутри сеанса Hibernate данная сущность существует только один раз. То есть если вы

Type type1 = (Type) session.get(Type.class, 42); 
Type type2 = (Type) session.get(Type.class, 42); 
Type type3 = (Type) session.createQuery("select t from Type t where t.id = 42").uniqueResult(); 

затем type1, type2 и type3 будут все ссылки на один объект. Таким образом, их добавление в пустой HashSet приведет к созданию HashSet размера 1, потому что Object.equals() возвращает true при сравнении объекта с самим собой.

-3

Если вы класс переопределяет метод 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 с

+0

материал, который я цитировал, - это поведение по умолчанию hashcode и equals, методы, которые используются hashset –

Смежные вопросы