2013-06-21 3 views
0

이 질문이 있습니다.자바에서 객체 identityhashcode

저는 프로젝트에서 일하고 있습니다 (EMF Compare도 사용하고 있습니다). 내가 사용하는 각 객체에 대한 고유 한 ID를 유지해야하므로 IdentityHashCode를 사용하기로 결정했습니다. 이해하는 한,이 값은 컴파일을 통해 동일합니다.

다른 클래스의 메서드에서 매개 변수로 개체를 지정했지만 해시 코드를 가져 오려고하면이 값이 개체의 값을 인쇄 할 때 볼 수있는 것과 다릅니다. 이 같은

뭔가 : System.out.println("The hash ID is: +Integer.toHexString(System.identityHashCode(obj)));

그러나

System.out.println("The Object is: "+obj)

나는이 얻을 결과 :

오브젝트는 다음과 같습니다 ***xxxxxxxxxxxxxx***[email protected] (name: Comment) has been removed.

해시 ID는 다음과 같습니다 1ec1758

두 값이 완전히 다르다는 것을 알 수 있겠지만 그 이유를 이해할 수는 없습니다. 지금까지 (그리고 작동하는) 유일한 방법은 객체의 문자열을 가져온 다음 하위 문자열 메서드를 사용하여 18e588c (이 예제의 경우)을 얻는 것입니다.이 예제의 경우

모든 답변을 주시면 감사하겠습니다.

내가 사용하고 각 개체에 대한 고유 ID를 유지할 필요가
+0

개체 (obj)는 어디에 만들어 졌습니까? 최대 절전 모드 나 다른 프레임 워크로 만들어 졌습니까? 그것은 당신의 객체가 프록시 일 뿐이며 obj.toString()을 호출하면 실제로 그 객체가 제거되었다고 응답 할 수 있습니다. 이것은 내부 객체가 제거되었거나 데이터베이스 연결이 닫혀 있다는 것을 의미합니다. 그러나 참조 된 객체의 hashCode가 존재하므로 해당 hashCode를 인쇄 할 수 있습니다. –

+0

클래스에 대해'hashCode()'를 재정의 했습니까? 그렇다면 구현 코드를 제공해야합니다. – Raedwald

답변

3

, 그 내가 IdentityHashCode를 사용하기로 결정 이유를, 지금까지의 내가 이해,이 값은 컴파일을 통해 동일입니다 감사합니다 .

아니요. 컴파일과 관련이 없으며 이 아니며이 유일 함을 보장합니다.

당신이하려는 일에 대해 명확하지 않지만 해시 코드를 고유하다고 생각해서는 안됩니다.

Object.hashCode 문서는 지정

할 수있는 한

는, Object 클래스에서 정의되는 hashCode 메소드는 다른 오브젝트에 대해서는 다른 정수 치를 돌려줍니다.

그렇지만 보증하는 것과 같은 것은 아닙니다.

또한toString()를 호출 한 결과에 의해 혼동되고있어 - 난 당신의 클래스가 실제로 hashCode()을 우선 생각하고, Object.toString()는 아이덴티티 해시 코드를 사용하여보다 잠재적으로 무시 hashCode() 방법을 대신 호출

을 Object 클래스의 toString 메서드는 객체가 인스턴스 인 클래스의 이름, at 기호 문자`@ '및 객체의 해시 코드의 부호없는 16 진수 표현으로 구성된 문자열을 반환합니다.

전화 할 경우
getClass().getName() + '@' + Integer.toHexString(hashCode()) 

obj.hashCode() 당신이 toString로 나타낸 것 같은 값을 볼 수 있습니다 : 즉,이 방법은 다음의 값과 동일한 문자열을 반환합니다.