DevBoi

equals와 hashcode차이 본문

Language/[Java]

equals와 hashcode차이

HiSmith 2022. 5. 11. 12:06
반응형

String은 new를 사용해서 새롭게 인스턴스를 만들고, 메모리에 올리기 때문에 다른 주소값을 참조하기에 == 연관시에 false가 리턴된다.

예를 들어서

String a. = "3"

String b = "4"

String c = new String("7")

 

이면 a == b 이지만 a !=c 이다.

String 은 wrapper class이지만, 같은 내용에 대해서는 같은 주소를 바라보게 끔 한다

String constant pool에 등록되기 때문이고

다른 주소값을 보는 c와는 같지 않다는 것을 알 수 있다.

 

hashcode는 해당 주소값을 hashFunction한 값을 출력한다.

 

object에 있는 equals는 해시코드에 대한 비교를 하고 결과를 return한다.

만약에 사용자가 임의로 만든 object에 대해서 값을 비교해 같은 object인것을 확인하려면

특정 값을 비교하는 equals 함수를 재정의 해야한다.

 

 

만약에 equals를 통해서 특정 객체에 대한 값 비교의 논리적 기준을 정했다고 가정해보자

 

hashcode에 대한 재정의도 동시에 필요하다고 얘기를 많이한다.

이유는 아래와 같다.

hashcode를 재정의하지 않으면 HashSet, HashMap, HashTable 해당 구현체를 사용할때 문제가 된다.

해당 구현체들은 아래와 같은 과정으로 객체가 같은지를 체크한다.

 

 

즉 hashcode에 대한 리턴값이 같다면, equals를 체크, 또 같다면 true로 리턴한다.

즉 hashcode & equals로 판단한다.

 

 

equals만 재정의 해도되지만 만약에 hash값을 사용하는 Collection을 사용한다면 equals 와 hashcode둘다 재정의를 해줘야한다.

반응형