쯔이's Dev

containsKey(f)(equals, hashcode 오버라이딩) 본문

JAVA

containsKey(f)(equals, hashcode 오버라이딩)

jjhim531 2025. 3. 27. 21:26
반응형
컬렉션 키-값 구조사용  메서드 설명
Map ✅ 있음 containsKey(key) 키가 있는지 확인
Set ❌ 없음 contains(value) 값이 존재하는지 확인
List ❌ 없음 contains(value) 해당 요소가 존재하는지 확인

 

“List는 equals만,  Set/Map은 equals + hashCode 둘 다!”

컬렉션 사용 메서드 필수 오버라이딩
List equals()만 사용 ✅ equals()
Set (HashSet) hashCode() → equals() ✅ 둘 다
Map (HashMap) hashCode() → equals() ✅ 둘 다

 

>> containsKey(key)란?

Map에서 주어진 키가 존재하는지를 검사하는 메서드

if (hMap.containsKey(f)) {
    return false;
}

이 containsKey(f)는 내부적으로 자동으로 이렇게 작동해요

실제로는 이런 순서로 작동함:

  1.   f.hashCode() 호출
  2.   해당 해시코드에 해당하는  bucket(슬롯)에 접근
  3.   거기에 있는 키들과 equals()로 비교
  4.   true면 이미 존재하는 키, false면 새로운 키로 인식

* hashCode() → equals() 순서로 비교함

 

@Override
public int hashCode() {
    return Objects.hash(this.getKind());
}

@Override
public boolean equals(Object obj) {
    if (obj instanceof Farm) {
        Farm f = ((Farm)obj);
        return f.getKind().equals(this.getKind());
    }
    return false;
}

이 코드 덕분에 Map은

  • new Farm("과일")과
  • 또 다른 new Farm("과일")을

같은 키라고 인식하게 되는 거예요.

 

Map이나 Set을 쓸 때 주의할 점


꼭 해야 할 일 이유
equals()와 hashCode() 오버라이딩 객체를 키로 쓸 때 중복 여부를 정확히 판단하기 위해
equals()만 있고 hashCode() 없으면? 버그 발생 위험!  Map에서 찾지를 못함
반대로 hashCode()만 있고 equals() 없으면? 같은 해시값이라도 다른 객체로 인식될 수 있음

 

 

정리 요약

  •  Map.containsKey(f)는 내부적으로 hashCode() + equals()를 자동 호출해서 비교함
  •  Farm 클래스에서 이 둘을 잘 오버라이딩해놨기 때문에, 중복 키가 잘 걸러짐
  •  그래서 .equals()를 코드에서 직접 호출할 필요는 없음

 

List<Farm> farmList = new ArrayList<>();
farmList.add(new Farm("견과"));

System.out.println(farmList.contains(new Farm("견과")));  // true ✅

 

  • List는 순서대로 하나하나 비교하면서 equals()만 사용
  • hashCode()는 사용하지 않음 (해시 기반이 아니기 때문)

비교 요약


컬렉션 contains() 내부 동작 사용하는 메서드
HashSet / HashMap hashCode() → equals() 둘 다 사용
ArrayList 순차 탐색 → equals()만 사용 equals()만 사용
TreeSet 정렬 기반 → compareTo() 사용 Comparable 구현 필요

 


 

꼭 기억할 것!

  •  Set, Map에서 contains() 또는 containsKey() 사용하려면
    → hashCode()와 equals() 반드시 올바르게 오버라이딩해야 함
  •  List는 hashCode() 안 쓰지만 equals()는 필수!

 

728x90
반응형

'JAVA' 카테고리의 다른 글

String vs StringBuilder  (0) 2025.02.14
StringTokenizer vs split()  (1) 2025.01.30
3-tier 아키텍처(service > dao > db)  (2) 2024.09.30