Java에서 IdentityHashMap과 HashMap의 차이점 + 성능 비교

게시 됨: 2021-10-19
신원의 차이hashmap-and-hashmap-performance-comparison

언젠가는 equality operator (==) 를 기반으로 Map의 Key를 비교해야 하는 특별한 경우가 있습니다. 등호 연산자(==)는 두 키의 참조(메모리 주소)를 두 개의 다른 숫자로 비교합니다.

반면에 HashMap은 equals() 메소드의 도움으로 Key의 고유성을 비교하는 Java Collection Framework 컴포넌트로 가장 많이 사용된다.

또한 IdentityHashMapobject.hashCode() 의 해시를 사용하지 않고 System.identityHashCode(object) 를 사용합니다. 런타임 중에 해시 코드가 변경되는 변경 가능한 개체에 대해 IdentityHashMap을 사용할 수 있습니다.

on String Object 적용되는 equals()== 에 대해 자세히 알아보려면 https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/ 자습서를 따르세요.

위의 equals() 및 == 동작을 보여주는 기본 테스트:

결과:

두 맵에서 성능 테스트를 수행해 보겠습니다.

  1. 자바 클래스 생성: CrunchifyIdentityHashMapVsHashMapPerformance .java
  2. startCrunchifyTest()
    • 수백만 단위의 랜덤 맵 크기 생성
    • crunchifyString[] 문자열 배열 객체를 위에서 생성된 텍스트와 함께 생성 및 초기화: This is Crunchify's Test # number
  3. crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString , Map<String, Integer> crunchifyMap , String name )
    • 모든 필수 매개변수를 이 메소드에 전달하십시오.
    • crunchifyMap 은 IdentityHashMap / HashMap 값을 갖습니다.
    • crunchifyString[]을 반복하고 Map에 값을 넣습니다. 이 작업에는 시간이 걸립니다.
    • crunchifyString[]을 반복하고 Map에서 값을 가져옵니다. 이 작업은 시간이 걸립니다.
    • 위의 두 작업에 대한 실행 시간을 알아내서 위의 작업 중 어느 것이 더 나은지 비교할 수 있습니다. IdentityHashMap 또는 HashMap
    • 위 결과 인쇄
  4. 위의 작업 2와 3을 총 8회 수행합니다.

결과:

관찰:

결과에서 볼 수 있듯이 큰 맵의 경우 IdentityHashMap이 훨씬 더 잘 수행됩니다. 왜요? IdentityHashMap doesn't use equals() and hashcode() methods .

참고로:

Map에서 값을 넣고 가져오기 위해 수행하는 위의 작업은 CPU를 매우 많이 사용합니다.

IdentityHashMap 대 HashMap 테스트 - CPU 사용량