Java에서 hashCode의 사용은 무엇입니까?


답변:


222

hashCode()사용되는 버킷 에서 Hash처럼 구현 HashMap, HashTable, HashSet

수신 된 값 은 세트 / 맵의 요소를 저장하기위한 버킷 번호hashCode() 로 사용 됩니다. 이 버킷 번호는 세트 / 맵 내의 요소 주소 입니다.

그렇게 contains()하면 요소의 해시 코드가 필요하며 해시 코드가 가리키는 버킷을 찾으십시오. 동일한 버킷에서 둘 이상의 요소가 발견되면 (여러 객체가 동일한 해시 코드를 가질 수 있음)이 equals()메소드를 사용 하여 객체가 같은지 평가 한 다음 contains()true 또는 false인지 판별하거나 element가 가능한지 여부를 결정합니다. 세트에 추가 여부.


28
안녕하세요 버디 .. 아주 좋은 대답이지만 실제 예제를 이해하기 쉬운 것과 동일한 링크를 찾았습니다 : coderanch.com/t/321515/java/java/HashCode
Logicalj

아이슈 감사합니다. 이제 버킷 관련 설명과 함께 해시 코드에 대한 명확한 지식을 얻었습니다.
Balasubramani

2
"동일한 버킷에 둘 이상의 요소가 equals()있는 경우 평가에 사용합니다 ", 일치하는 해시 코드와 일치하는 요소가 하나만 있으면 직접 true를 반환합니까? 그러나 여러 객체가 동일한 해시 코드를 가질 수 있으므로 equals()일치하는 요소가 동일한 지 평가 하기 위해 실행 해야합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다. 맞습니까?
Saorikido

버킷 외에도, 해시 코드는 객체가 메모리에 각 객체를 저장하는 순서를 결정하기 위해 객체가 호출하는 메소드입니다. 객체가 같으면 해시 코드도 같아야합니다. (이 진술의 반대는 거짓입니다)
NoName

1
어떤 경우 프로그래머가 수동으로 hashCode()메소드를 호출 합니까?
추기경-복원 모니카

33

로부터 자바 독 :

객체의 해시 코드 값을 반환합니다. 이 방법은에서 제공하는 것과 같은 해시 테이블의 이점을 위해 지원됩니다 java.util.Hashtable.

일반 계약 hashCode은 다음과 같습니다.

  • Java 응용 프로그램을 실행하는 동안 동일한 객체에서 두 번 이상 호출 될 때마다 객체의 등가 비교에 사용 된 정보가 수정되지 않으면 hashCode메소드는 동일한 정수를 일관되게 반환해야합니다 . 이 정수는 응용 프로그램의 한 실행에서 동일한 응용 프로그램의 다른 실행까지 일관성을 유지할 필요가 없습니다.

  • equals(Object)메소드 에 따라 두 오브젝트가 동일한 경우 두 오브젝트 각각에서 메소드를 호출 hashCode하면 동일한 정수 결과가 생성되어야합니다.

  • 되어 있지 두 개체가에 따라 동일하지 않은 경우 필요는 equals(java.lang.Object)방법, 그 호출 hashCode결과가 다른 정수 개의 객체들 각각에 대한 방법. 그러나 프로그래머는 동일하지 않은 객체에 대해 고유 한 정수 결과를 생성하면 해시 테이블의 성능을 향상시킬 수 있음을 알고 있어야합니다.

합리적으로 실용적이기는하지만 Object 클래스에 의해 정의 된 hashCode 메소드는 개별 오브젝트에 대해 고유 한 정수를 리턴합니다. (이것은 일반적으로 객체의 내부 주소를 integer로 변환하여 구현되지만 Java 프로그래밍 언어에서는이 구현 기술이 필요하지 않습니다.)


14

에 의해 반환되는 값 hashCode()은 16 진수로 된 객체의 메모리 주소 인 객체의 해시 코드입니다.

정의에 따라 두 객체가 같으면 해시 코드도 같아야합니다. equals()메소드 를 대체하는 경우 두 오브젝트가 동일하게 표현되고 오브젝트 구현 hashCode()이 더 이상 유효하지 않은 방식을 변경 합니다. 따라서 equals () 메소드를 대체하는 경우 hashCode()메소드 도 대체해야합니다 .

이 답변은 Java SE 8 공식 튜토리얼 문서에서 가져온 것입니다.


13

hashCode()객체를 가져 와서 숫자 값을 출력하는 함수입니다. 객체가 변경되지 않으면 객체의 해시 코드는 항상 동일합니다.

기능처럼 HashMap, HashTable, HashSet, 등 저장소 개체에 대한 필요성은가 사용할 hashCode객체를 저장할 것 "메모리 위치"(즉, 배열 위치)에서 선택하는 내부 배열의 크기를 모듈로.

충돌이 발생할 수있는 경우가 있으며 (두 객체가 동일한 해시 코드로 끝나는 경우도 있음) 물론 신중하게 해결해야합니다.


6

해시 코드는 비즈니스 로직과 아무 관련이 없지만 대부분의 경우이를 처리해야합니다. 객체가 해시 기반 컨테이너 (HashSet, HashMap ...)에 넣으면 컨테이너가 요소의 해시 코드를 넣거나 가져옵니다.


아닙니다. 키를 넣거나 얻습니다. hashCode는 버킷 팅에만 사용됩니다
Marquis of

3

해시는 개체로부터 생성 된 번호이다.

이를 통해 해시 테이블에 객체를 빠르게 저장 / 검색 할 수 있습니다.

다음과 같은 간단한 예를 상상해보십시오 .

당신 앞에있는 테이블에. 각각 1에서 9까지 숫자로 표시된 9 개의 상자가 있습니다. 또한이 상자에 보관할 엄청나게 다른 물건 더미가 있습니다. 그러나 일단 상자에 들어가면 가능한 빨리 찾을 수 있어야합니다.

필요한 것은 각 개체를 넣은 상자를 즉시 ​​결정하는 방법입니다. 인덱스처럼 작동합니다. 양배추를 찾아서 양배추가 들어있는 상자를 찾은 다음 해당 상자로 바로 이동하여 가져옵니다.

이제 인덱스를 귀찮게하고 싶지 않다면 어떤 상자에 들어있는 객체에서 즉시 찾을 수 있기를 원한다고 상상해보십시오.

이 예에서는 객체 이름에 포함 된 글자 수와 같은 간단한 방법을 사용합니다. 양배추는 상자 7에 들어가고, 완두콩은 상자 3에 들어가고, 상자 6에있는 로켓, 상자 5에있는 밴조 등이 들어갑니다.

코뿔소는 어떻습니까? 여기에는 10 개의 문자가 있으므로 알고리즘을 약간 변경하고 "포장"하여 10 자 개체가 상자 1에, 11 자에 상자 2 등이되도록합니다. 그것은 모든 대상을 포함해야합니다.

때로는 상자에 물건이 두 개 이상 들어 있지만 로켓을 찾고 있다면 양배추, 완두콩, 밴조 및 코뿔소 더미 전체를 확인하는 것보다 땅콩과 로켓을 비교하는 것이 훨씬 빠릅니다.

해시 코드입니다. Hashtable에 저장 될 수 있도록 객체에서 숫자를 얻는 방법입니다. Java에서 해시 코드는 임의의 정수일 수 있으며 각 객체 유형은 자체 생성을 담당합니다. Object의 "hashCode"메소드를 찾으십시오.

출처- 여기


-1

hashCode ()의 사용 중 하나는 캐칭 메커니즘을 빌드하는 것 입니다. 이 예를보십시오 :

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}

'잡기 메커니즘 구축'이란 무엇입니까? 이 코드는 어떻게 설명합니까?
Lorne의 후작

-1

hashCode()JVM이 모든 오브젝트 작성에 대해 생성 하는 고유 코드입니다.

hashCode()Hashtable, Hashmap 등과 같은 해싱 관련 알고리즘에 대한 작업을 수행 하는 데 사용 됩니다.

hashCode()고유 코드가있는 객체를 검색 할 때 해당 객체를 찾는 데 도움이되므로 검색 작업을 쉽게 수행 할 수 있는 장점이 있습니다.

그러나 우리 hashCode()는 객체의 주소를 말할 수 없습니다 . JVM이 모든 오브젝트에 대해 생성 한 고유 코드입니다.

이것이 오늘날 해싱 알고리즘이 가장 인기있는 검색 알고리즘 인 이유입니다.


4
해시 코드는 고유하지 않습니다. 2 개의 동일하지 않은 객체는 동일한 해시 코드를 반환 할 수 있습니다.
Ranielle Canlas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.