작성
·
75
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
< 사전 설명 >
Rectangle 객체에서 hashCode()와 equals() 둘중
equals()만 오버라이드 하였습니다. 이후
public class RectangleTest {
public static void main(String[] args) {
Set<Rectangle> rectangleSet = new HashSet<>();
for (int i = 0; i < 13; i++) {
rectangleSet.add(new Rectangle(20, 20));
}
System.out.println(rectangleSet.size());
for (Rectangle rectangle : rectangleSet) {
System.out.println("rectangle = " + rectangle);
}
}
}
위와 같은 코드를 작성했을때
System.out.println(rectangleSet.size());
출력 결과가 13이 나오고
for문의 출력 결과도 같은 결과가 13번 나옵니다.
< 질문 >
hashCode()를 오버라이드 하지 않음으로써 해시인덱스가 랜덤으로 배정되는 것으로 알고있습니다.
그래서 논리적으로 같은 객체가 들어오더라도 다른 해시인덱스에 할당 되는것이 문제가 됩니다.
하지만 제가 작성한 코드와 같이 많은 for문을 돌게 될면
새로 만들어진 Rectangle 객체가 언젠가 최소 한번쯤은 해시인덱스에서 중복된 객체를 만나게되고, 중복되는 해시 인덱스의 버킷에서 equals() 메서드가 실행되어 저장이 취소될것이라고 예상했습니다.
그래서 rectangleSet.size()는 13 미만이 될거라 생각했지만 아니었습니다.
오버라이드된 equals() 메서드가 실행되지 않는 이유가 무엇일까요?
답변 1
0
안녕하세요. 공희배님, 공식 서포터즈 y2gcoder입니다.
hashcode를 오버라이딩하지 않으셨다면, Object의 hashcode()를 사용하게 됩니다! 그리고 Object의 hashcode는 객체의 메모리 주소를 기반으로 생성되기 때문에, 오버라이딩 했을 때보다 중복된 해시코드가 나올 가능성이 더 적습니다! 그래서 아마 13번 반복했을 때 중복된 해시코드를 가진 객체가 하나도 없었을 것이라 예상합니다!
그리고 Object의 메모리 주소를 통한 해시코드를 생성했을 때는 일반적인 경우에 중복된 해시코드를 보는 일이 거의 없을 것이라 생각합니다 🙂
감사합니다.