-
equals 와 hashcodeDevelop/Java 2022. 8. 16. 16:54
Hash 란?
- 임의의 길이를 갖는 데이터를 고정된 길이의 데이터로 변환(매핑)하는 것
- abcd 라는 문자열이 있다면 이를 특정 길이(ex 256bit, 512bit...)의 데이터로 변환시킨다는 것 (Hashing 이라고 함)
- 해시함수를 돌리기 전 문자열의 길이가 얼마건 일정한 길이를 얻는다.
- 변환한 데이터를 다이제스트 라고 한다.

Hash를 사용하는 이유?
- 특정 값에 대한 다이제스트는 변하지 않기 때문에 이 다이제스트의 값을 배열의 위치(index)로 활용 (검색 속도 빠름)
- 동일한 메세지(값)에 대해서는 동일한 다이제스트를 갖기 때문에 중복을 허용하지 않는다. (HashSet의 기본 개념)
HashCode()
- 자바에서는 hashCode() 메소드를 활용하여, 객체의 주소값을 이용하여 해시 알고리즘에 의해 생성 된 고유의 정수값을 반환한다. 즉, 객체가 같은 메모리 주소를 가리키고 있다면 같은 정수값을 얻는다.
- hashcode() 메소드의 반환값은 int형인데
TestClazz t1 = new TestClazz(); TestClazz t2 = new TestClazz(); TestClazz t3 = t1; System.out.println("t1 : " + t1.hashCode()); System.out.println("t2 : " + t2.hashCode()); System.out.println("t3 : " + t3.hashCode());결과
t1 : 2023938592
t2 : 195615004
t3 : 2023938592equals()란?
- boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용
- 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다.
- String 클래스에서는 동일한 문자열을 2개 생성하면 서로 다른 메모리 상에 할당된다. 하지만 equals를 사용하면 true인 이유는 String 클래스에서 equals 메소드를 오버라이드하여 문자를 비교하는 코드를 추가했기 때문이다.
public boolean equals(Object anObject) { if (this == anObject) { return true; } return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value); }eqauls와 hashcode의 관계
- 동일한 객체는 동일한 메모리 주소를 갖기 때문에, 동일한 객체는 동일한 hashCode를 가진다.
- equals() 메소드를 오버라이드 할 때, hashCode() 메소드도 오버라이드 되어야 한다.
- equals() 메서드로 같은 객체는 같은 hashCode() 결과가 나와야 한다.
- hashCode() 메서드로 같은 객체가 항상 equals() 메서드로 같은 객체는 아니다.
출처
https://mangkyu.tistory.com/101
https://studyandwrite.tistory.com/475