programing

Java에서 hashCode의 용도는 무엇입니까?

prostudy 2022. 7. 6. 20:26
반응형

Java에서 hashCode의 용도는 무엇입니까?

자바에서는obj.hashCode()값을 반환합니다.이 해시코드는 프로그래밍에서 어떤 용도로 사용됩니까?

hashCode()에서의 버킷에 사용됩니다.Hash다음과 같은 구현HashMap,HashTable,HashSet,기타.

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

할 때contains()요소의 해시 코드를 가져와서 해시 코드가 가리키는 버킷을 찾습니다.같은 버킷에 여러 요소가 있는 경우(복수의 오브젝트가 같은 해시 코드를 가질 수 있음)에는equals()객체가 동일한지 여부를 평가한 다음 여부를 결정하는 방법contains()true 또는 false 또는 요소를 세트에 추가할 수 있는지 여부를 결정합니다.

Javadoc에서:

개체의 해시 코드 값을 반환합니다.이 메서드는 다음과 같은 해시 테이블을 위해 지원됩니다.java.util.Hashtable.

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

  • Java 어플리케이션 실행 중에 동일한 오브젝트에서 여러 번 호출될 때마다hashCode오브젝트에 대한 동등한 비교에 사용되는 정보가 변경되지 않는 한 메서드는 동일한 정수를 일관되게 반환해야 합니다.이 정수는 응용 프로그램 실행 간에 일관성을 유지할 필요가 없습니다.

  • 에 따라 2개의 객체가 동일한 경우equals(Object)메서드, 그 후 콜hashCode두 개체의 메서드는 동일한 정수 결과를 생성해야 합니다.

  • 2개의 오브젝트가 다음 조건에 따라 동일하지 않은 경우equals(java.lang.Object)메서드, 그 후 콜hashCode두 객체 각각에 대한 메서드는 고유한 정수 결과를 생성해야 합니다.단, 프로그래머는 불평등한 오브젝트에 대해 별개의 정수 결과를 생성하면 해시 테이블의 성능이 향상될 수 있음을 알아야 합니다.

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

에 의해 반환된 값hashCode()는 오브젝트의 해시 코드입니다.16 진수의 오브젝트의 메모리주소입니다.

정의상 두 개체가 동일한 경우 해시 코드도 같아야 합니다.를 덮어쓰면equals()방법, 두 개의 객체가 동일해지는 방식과 객체의 구현 방식을 변경합니다.hashCode()는 무효가 되었습니다.따라서 equals() 메서드를 오버라이드할 경우,hashCode()메서드도 있습니다.

이 답변은 Java SE 8 공식 튜토리얼 매뉴얼에 기재되어 있습니다.

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

음음음 functions 등의 HashMap,HashTable,HashSet , 「」, 「」를 합니다.hashCode내부 어레이의 크기를 모듈화하여 오브젝트를 저장할 "메모리 위치" (어레이 위치)를 선택합니다.

충돌이 발생할 수 있는 경우(2개의 오브젝트가 같은 해시코드로 끝나는 경우)는 물론 신중하게 해결해야 합니다.

해시 코드는 모든 개체에서 생성된 숫자입니다.

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

다음과 같은 간단한 예를 생각해 보겠습니다.

당신 앞에 있는 테이블 위에.각각 1에서 9까지의 숫자가 표시된 9개의 상자가 있습니다.또한 이 상자 안에 보관해야 할 매우 다른 물건들이 산더미처럼 쌓여있지만, 일단 그것들이 안에 들어간 후에는 가능한 한 빨리 그것들을 찾을 수 있어야 합니다.

필요한 것은 각 물건을 어떤 상자에 넣었는지 즉시 결정하는 방법입니다.그것은 색인처럼 작동합니다.당신은 양배추를 찾기로 결심하고 양배추가 어떤 상자에 들어 있는지 찾아보고, 그것을 가지러 그 상자로 곧장 갑니다.

이제 인덱스에 신경 쓰지 않고 인덱스가 어떤 상자에 있는지 개체에서 즉시 확인할 수 있다고 상상해 보십시오.

이 예에서는 오브젝트 이름의 글자 수라는 매우 간단한 방법을 사용해 보겠습니다.양배추는 상자 7에, 콩은 상자 3에, 로켓은 상자 6에, 밴조는 상자 5에, 기타 등등.

그런데 코뿔소는 어쩌고?10글자로 구성되어 있기 때문에 알고리즘을 조금 변경하여 10글자의 오브젝트가 상자 1에 들어가고 11글자가 상자 2에 들어가도록 "감기"합니다.어떤 물건이라도 덮을 수 있을 거야

때로는 상자 안에 두 개 이상의 물체가 들어있지만, 만약 로켓을 찾고 있다면, 양배추, 완두콩, 밴조, 그리고 코뿔소를 전부 확인하는 것보다 땅콩과 로켓을 비교하는 것이 훨씬 더 빠르다.

그건 해시 코드야.해시 테이블에 저장할 수 있도록 개체에서 번호를 가져오는 방법입니다.Java에서는 해시 코드가 임의의 정수일 수 있으며 각 개체 유형은 자체 생성을 담당합니다.개체의 "hashCode" 메서드를 검색합니다.

출처 - 여기

해시코드는 귀사의 비즈니스 로직에는 아무런 영향을 미치지 않지만 대부분의 경우 우리가 처리해야 합니다. 베이스 「 」 )에 때( 「 」HashSet,HashMap는 요소의 코드를 넣거나

해시 코드

equals()를 덮어쓸 때마다 hashCode()도 덮어쓰게 됩니다.해시 코드는 객체를 맵에 키로 저장할 때 사용됩니다.

해시 코드는 클래스의 인스턴스를 한정된 수의 범주로 분류하는 숫자입니다.제가 카드 한 장을 드렸다고 상상해 보세요.그리고 제가 당신에게 특정 카드를 요구한다고 말씀드렸기 때문에 저는 올바른 카드를 빨리 돌려받고 싶습니다.준비하고 싶은 만큼 시간이 있는데, 카드를 달라고 하면 너무 급해요.13장의 카드를 만들 수 있습니다.모든 에이스가 한 무더기에, 모든 2개가 다른 무더기에, 기타 등등.그러면 내가 하트 5개를 달라고 하면 5개가 더미 안에 있는 카드 4개 중에 맞는 카드를 뽑으면 돼.52장의 카드를 모두 사용하는 것보다 확실히 빠릅니다!테이블 위에 공간이 충분하다면 52개의 파일도 만들 수 있습니다.

참고 자료: OCP Oracle Certified Professional Java SE 8 Programmer II

hashCode()는 오브젝트 작성 시마다 JVM에 의해 생성되는 고유 코드입니다.

는 용용 we we we we we we we we wehashCode()해시 테이블, 해시 맵 등과 같은 해시 관련 알고리즘에 대한 작업을 수행합니다.

hashCode()고유 코드를 가진 개체를 검색할 때 해당 개체를 찾는 데 도움이 되기 때문에 검색 작업을 쉽게 할 수 있습니다.

해서 ''라고 말할는 없어요.hashCode()을 사용하다이것은 모든 개체에 대해 JVM에 의해 생성된 고유한 코드입니다.

그래서 요즘 해시 알고리즘이 가장 인기 있는 검색 알고리즘이다.

hashCode()의 용도 중 하나는 Catching 메커니즘을 구축하는 것입니다.다음 예를 보겠습니다.

        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));
}

언급URL : https://stackoverflow.com/questions/3563847/what-is-the-use-of-hashcode-in-java

반응형