Когда только равно равно переопределить, почему список находит элемент как истина? - PullRequest
0 голосов
/ 13 мая 2019

Я знаю, что и хэш-код, и равно должны быть переопределены. Я попробовал приведенную ниже программу, и мне было интересно, почему list может искать студента, когда set не может найти студента, когда переопределяется только equals:

import java.util.*;

class Student {
private int id;
private String name;

public Student(int id, String name) {
    this.name = name;
    this.id = id;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) return false;

    if (!(obj instanceof Student))
        return false;

    if (obj == this)
        return true;

    return this.getId() == ((Student) obj).getId();
}
}

public class StudentHashcodeEquals {
public static void main(String[] args) {
    Student alex1 = new Student(1, "Alex");
    Student alex2 = new Student(1, "Alex");

    System.out.println("alex1 hashcode = " + alex1.hashCode());
    System.out.println("alex2 hashcode = " + alex2.hashCode());
    System.out.println("Checking equality between alex1 and alex2 = " + alex1.equals(alex2));

    List<Student> studentsLst = new ArrayList <Student>();
    studentsLst.add(alex1);
    studentsLst.add(alex2);

    System.out.println("Arraylist size = " + studentsLst.size());
    System.out.println("Arraylist contains Alex = " + studentsLst.contains(new Student(1, "Alex")));

    HashSet <Student> students = new HashSet <Student>();
    students.add(alex1);
    students.add(alex2);

    System.out.println("HashSet size = " + students.size());
    System.out.println("HashSet contains Alex = " + students.contains(new Student(1, "Alex")));
}
}

/*
alex1 hashcode = 366712642
alex2 hashcode = 1829164700
Checking equality between alex1 and alex2 = true
Arraylist size = 2
Arraylist contains Alex = true
HashSet size = 2
HashSet contains Alex = false
*/

Когда ученик был вставлен в список, я предполагаю, что он вставит его в 2 разных сегмента, так как реализация хеш-кода отсутствует, и будет добавлен хеш-код объекта по умолчанию, и он сохранит их в 2 разных хэш-кодах и при поиске другого объекта он сначала должен найти ячейку с помощью хеш-кода, но реализация хеш-кода отсутствует, а затем то, как list может все еще идентифицировать его, тогда как set - нет *

Спасибо!

1 Ответ

0 голосов
/ 13 мая 2019

Списки не используют хеш-код объекта.В зависимости от их типа, они хранят массив ссылок на объекты.

Если вы вызываете contains в списке, он будет перебирать список, используя .equals(), чтобы проверить, находится ли объект в списке.

...