자바 객체를 비교할때 equals 뿐만 아니라 hashode도 오버라이드 해줘야 하는 이유
public class Student {
private int student_id;
private String name;
private String major;
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.equals(s2)); // false
}
Student s1 = new Student();
s1.setStudent_id(201001596);
s1.setName("Nanamare");
s1.setMajor("Computer Science");Student s2 = new Student();
s2.setStudent_id(201001596 );
s2.setName("Nanamare");
s2.setMajor("Computer Science");System.out.println(s1.equals(s2)); // false
}
위의 두 객체는 같은 학번, 이름, 전공을 가졌기 때문에 의미상 같은 객체로 취급되어야 하지만 지금은
힙영역에 따로 잡혀있는 실정이다. (따라서 참조변수의 주소가 달라지고 false가 나오게 된다.)
이를 해결 하기위해선 equals 메소드를 오버라이드 해야한다.
public class Student {
private int student_id;
private String name;
private String major;
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public boolean equals(Object o){
Student s = (Student) o;
if(student_id == s.getStudent_id()
&& name.equals(s.getName())
&& major.equals(s.getMajor())){
return true;
} else {
return false;
}
}
}
위의 문제는 해결한거같아 보인다. 하지만 equals만 가지고는 HashMap, HashSet과 같이 key, value의 구조를 가진 자료구조에서는 아쉽게도 제대로 작동하지 않는다. hashset이나 hashmap의 key값은 haschode 비교에 의하여 중복 여부가 결정되기 때문이다. 그러무로 우리는 HashCode 메소드도 추가로 오버라이드 해야 한다.
public class Student {
private int student_id;
private String name;
private String major;
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public boolean equals(Object o){
Student s = (Student) o;
if(student_id == s.getStudent_id()
&& name.equals(s.getName())
&& major.equals(s.getMajor())){
return true;
} else {
return false;
}
}
@Override
public int hashCode(){
String s = ""+student_id+name+major;
return s.hashCode();
}
}
public static void main(String[] args){
Student s1 = new Student();
s1.setStudent_id(201001596);
s1.setName("Nanamare");
s1.setMajor("Computer Science"); Student s2 = new Student();
s1.setStudent_id(201001596);
s1.setName("Nanamare");
s2.setMajor("Computer Science"); HashMap<Student, String> advisors = new HashMap<Student, String>();
advisors.put(s1, "finish");
System.out.println(advisors.get(s2));
}이로서 해결 되었다!
finish~
'Kotlin & Java' 카테고리의 다른 글
자바 기본 타입 (Primitive type) (0) | 2020.02.27 |
---|---|
간단하게 코루틴 알아보기 (0) | 2020.02.16 |
무공변성 공변성 반공변성 (0) | 2020.01.24 |
[Java ] 두개의 리스트에서 중복되는 객체 비교 (0) | 2018.11.08 |
What is CALL BACK? 콜백 (0) | 2017.05.12 |