HashCode란 해시 함수의 값 / 해시 함수를 통해 객체비교를 하기위한 값입니다.
hashCode()가 필요한 이유는 객체 비교를 하는 시간 때문 !
만약 equals()로 Integer가 아닌 객체를 비교 할 경우
생가보다 많은 시간이 걸립니다 .게다가 객체의 수가 많아질 경우 더욱 많은 시간을 쓰게 됩니다.
이때 hashcode()는 정수로 이뤄져있어 객체를 비교할 때에도 정수로 비교가 가능합니다 .
String Str1 = "hello";
String Str 2= "hello";
String Str3 = new String("hello");
Str1과 2는 같은 해시값을 가지지만 Str3은 다른 Hash값을 가집니다.
이유는 1과 2는 같은 오브젝트를 가리키기 떄문이고 3은 다른 객체를 가리키기 때문인데
사실 우리는 3 또한 같은 오브젝트에 같은 값을 가져 equals() 함수를 사용할경우
True가 나오길 원합니다 .
이때 우리는 hashcode() 함수를 사용하는데 이때 규약이
3) hashCode의 규약
- 어떤 객체를 변경하지 않았다면, hashCode는 여러번 호출해도 그 결과는 항상 같아야 한다.
- equals 메서드의 실행 결과로 두 객체가 같다고 나온다면, hashCode 메서드의 호출 결과도 같아야 한다.
그래서 hashcode() 오버라이딩 해주면 equals()함수도 오버라이딩 해줘야 한다 .
규약은 아니지만 hash 값은 hashFunction을 통해 값을 만들기에 같은 값을 가지고 있을수 있는데
이를 최대한 없이 만드는게 시간복잡도면에서 좋다 .
Hash의 장점은 시간복잡도가 O(1) 이라는 것인데 같은 해시값을 가질수록 선형검색에 가까워지므로
hashcode를 정의 할때 최대한 같은 값이 나오지 않게 재정의 해주는게 중요하다 .
'자바' 카테고리의 다른 글
Array/List / Set (0) | 2023.03.16 |
---|---|
Generic 사용 이유 (0) | 2023.03.16 |
댓글