Java에서는 obj.hashCode()
일부 값을 반환합니다. 프로그래밍에서이 해시 코드를 사용하는 것은 무엇입니까?
Java에서는 obj.hashCode()
일부 값을 반환합니다. 프로그래밍에서이 해시 코드를 사용하는 것은 무엇입니까?
답변:
hashCode()
사용되는 버킷 에서 Hash
처럼 구현 HashMap
, HashTable
, HashSet
등
수신 된 값 은 세트 / 맵의 요소를 저장하기위한 버킷 번호hashCode()
로 사용 됩니다. 이 버킷 번호는 세트 / 맵 내의 요소 주소 입니다.
그렇게 contains()
하면 요소의 해시 코드가 필요하며 해시 코드가 가리키는 버킷을 찾으십시오. 동일한 버킷에서 둘 이상의 요소가 발견되면 (여러 객체가 동일한 해시 코드를 가질 수 있음)이 equals()
메소드를 사용 하여 객체가 같은지 평가 한 다음 contains()
true 또는 false인지 판별하거나 element가 가능한지 여부를 결정합니다. 세트에 추가 여부.
equals()
있는 경우 평가에 사용합니다 ", 일치하는 해시 코드와 일치하는 요소가 하나만 있으면 직접 true를 반환합니까? 그러나 여러 객체가 동일한 해시 코드를 가질 수 있으므로 equals()
일치하는 요소가 동일한 지 평가 하기 위해 실행 해야합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다. 맞습니까?
hashCode()
메소드를 호출 합니까?
로부터 자바 독 :
객체의 해시 코드 값을 반환합니다. 이 방법은에서 제공하는 것과 같은 해시 테이블의 이점을 위해 지원됩니다
java.util.Hashtable
.일반 계약
hashCode
은 다음과 같습니다.
Java 응용 프로그램을 실행하는 동안 동일한 객체에서 두 번 이상 호출 될 때마다 객체의 등가 비교에 사용 된 정보가 수정되지 않으면
hashCode
메소드는 동일한 정수를 일관되게 반환해야합니다 . 이 정수는 응용 프로그램의 한 실행에서 동일한 응용 프로그램의 다른 실행까지 일관성을 유지할 필요가 없습니다.
equals(Object)
메소드 에 따라 두 오브젝트가 동일한 경우 두 오브젝트 각각에서 메소드를 호출hashCode
하면 동일한 정수 결과가 생성되어야합니다.되어 있지 두 개체가에 따라 동일하지 않은 경우 필요는
equals(java.lang.Object)
방법, 그 호출hashCode
결과가 다른 정수 개의 객체들 각각에 대한 방법. 그러나 프로그래머는 동일하지 않은 객체에 대해 고유 한 정수 결과를 생성하면 해시 테이블의 성능을 향상시킬 수 있음을 알고 있어야합니다.합리적으로 실용적이기는하지만 Object 클래스에 의해 정의 된 hashCode 메소드는 개별 오브젝트에 대해 고유 한 정수를 리턴합니다. (이것은 일반적으로 객체의 내부 주소를 integer로 변환하여 구현되지만 Java 프로그래밍 언어에서는이 구현 기술이 필요하지 않습니다.)
에 의해 반환되는 값
hashCode()
은 16 진수로 된 객체의 메모리 주소 인 객체의 해시 코드입니다.정의에 따라 두 객체가 같으면 해시 코드도 같아야합니다.
equals()
메소드 를 대체하는 경우 두 오브젝트가 동일하게 표현되고 오브젝트 구현hashCode()
이 더 이상 유효하지 않은 방식을 변경 합니다. 따라서 equals () 메소드를 대체하는 경우hashCode()
메소드 도 대체해야합니다 .
해시 코드는 비즈니스 로직과 아무 관련이 없지만 대부분의 경우이를 처리해야합니다. 객체가 해시 기반 컨테이너 (HashSet, HashMap ...)에 넣으면 컨테이너가 요소의 해시 코드를 넣거나 가져옵니다.
해시는 개체로부터 생성 된 번호이다.
이를 통해 해시 테이블에 객체를 빠르게 저장 / 검색 할 수 있습니다.
다음과 같은 간단한 예를 상상해보십시오 .
당신 앞에있는 테이블에. 각각 1에서 9까지 숫자로 표시된 9 개의 상자가 있습니다. 또한이 상자에 보관할 엄청나게 다른 물건 더미가 있습니다. 그러나 일단 상자에 들어가면 가능한 빨리 찾을 수 있어야합니다.
필요한 것은 각 개체를 넣은 상자를 즉시 결정하는 방법입니다. 인덱스처럼 작동합니다. 양배추를 찾아서 양배추가 들어있는 상자를 찾은 다음 해당 상자로 바로 이동하여 가져옵니다.
이제 인덱스를 귀찮게하고 싶지 않다면 어떤 상자에 들어있는 객체에서 즉시 찾을 수 있기를 원한다고 상상해보십시오.
이 예에서는 객체 이름에 포함 된 글자 수와 같은 간단한 방법을 사용합니다. 양배추는 상자 7에 들어가고, 완두콩은 상자 3에 들어가고, 상자 6에있는 로켓, 상자 5에있는 밴조 등이 들어갑니다.
코뿔소는 어떻습니까? 여기에는 10 개의 문자가 있으므로 알고리즘을 약간 변경하고 "포장"하여 10 자 개체가 상자 1에, 11 자에 상자 2 등이되도록합니다. 그것은 모든 대상을 포함해야합니다.
때로는 상자에 물건이 두 개 이상 들어 있지만 로켓을 찾고 있다면 양배추, 완두콩, 밴조 및 코뿔소 더미 전체를 확인하는 것보다 땅콩과 로켓을 비교하는 것이 훨씬 빠릅니다.
해시 코드입니다. Hashtable에 저장 될 수 있도록 객체에서 숫자를 얻는 방법입니다. Java에서 해시 코드는 임의의 정수일 수 있으며 각 객체 유형은 자체 생성을 담당합니다. Object의 "hashCode"메소드를 찾으십시오.
출처- 여기
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));
}
hashCode()
JVM이 모든 오브젝트 작성에 대해 생성 하는 고유 코드입니다.
hashCode()
Hashtable, Hashmap 등과 같은 해싱 관련 알고리즘에 대한 작업을 수행 하는 데 사용 됩니다.
hashCode()
고유 코드가있는 객체를 검색 할 때 해당 객체를 찾는 데 도움이되므로 검색 작업을 쉽게 수행 할 수 있는 장점이 있습니다.
그러나 우리 hashCode()
는 객체의 주소를 말할 수 없습니다 . JVM이 모든 오브젝트에 대해 생성 한 고유 코드입니다.
이것이 오늘날 해싱 알고리즘이 가장 인기있는 검색 알고리즘 인 이유입니다.