Java의 클래스가 hashCode ()를 재정의하지 않으면 이 클래스의 인스턴스를 인쇄하면 고유 한 숫자가 나타납니다.
Object의 Javadoc은 hashCode () 에 대해 말합니다 .
합리적으로 실용적이기는하지만 Object 클래스에 의해 정의 된 hashCode 메소드는 개별 오브젝트에 대해 고유 정수를 리턴합니다.
그러나 클래스가 hashCode ()를 재정의 하면 고유 번호를 어떻게 얻을 수 있습니까?
답변
System.identityHashCode (yourObject) 는 yourObject 의 ‘원래’해시 코드를 정수로 제공합니다. 독창성이 반드시 보장되는 것은 아닙니다. Sun JVM 구현은이 객체의 원래 메모리 주소와 관련된 값을 제공하지만 이는 구현 세부 사항이므로 의존해서는 안됩니다.
편집 : re 아래 Tom의 의견에 따라 수정 된 답변. 메모리 주소와 움직이는 물체.
답변
Object 용 javadoc은 다음을 지정합니다.
이는 일반적으로 오브젝트의 내부 주소를 정수로 변환하여 구현되지만이 구현 기술은 JavaTM 프로그래밍 언어에 필요하지 않습니다.
클래스가 hashCode를 재정의하면 특정 ID를 생성하고 싶다는 것을 의미합니다.
System.identityHashCode 를 사용 하여 모든 클래스의 해당 ID를 얻을 수 있습니다 .
답변
hashCode()
이 방법은 객체에 고유 식별자를 제공하기위한 것이 아닙니다. 오히려 객체의 상태 (즉, 멤버 필드의 값)를 단일 정수로 요약합니다. 이 값은 주로 객체를 효과적으로 저장하고 검색하기 위해 맵 및 세트와 같은 일부 해시 기반 데이터 구조에서 사용됩니다.
객체의 식별자가 필요한 경우 재정의 대신 고유 한 방법을 추가하는 것이 좋습니다 hashCode
. 이를 위해 아래와 같이 기본 인터페이스 (또는 추상 클래스)를 만들 수 있습니다.
public interface IdentifiedObject<I> {
I getId();
}
사용법 예 :
public class User implements IdentifiedObject<Integer> {
private Integer studentId;
public User(Integer studentId) {
this.studentId = studentId;
}
@Override
public Integer getId() {
return studentId;
}
}
답변
어쩌면이 빠르고 더러운 솔루션이 효과가 있습니까?
public class A {
static int UNIQUE_ID = 0;
int uid = ++UNIQUE_ID;
public int hashCode() {
return uid;
}
}
또한 초기화되는 클래스의 인스턴스 수를 제공합니다.
답변
수정 가능한 클래스 인 경우 클래스 변수를 선언 할 수 static java.util.concurrent.atomic.AtomicInteger nextInstanceId
있습니다. (명확한 방법으로 초기 값을 제공해야합니다.) 그런 다음 인스턴스 변수를 선언하십시오 int instanceId = nextInstanceId.getAndIncrement()
.
답변
여러 스레드에서 객체를 만들고 직렬화 할 수있는 경우에 작동하는이 솔루션을 생각해 냈습니다.
public abstract class ObjBase implements Serializable
private static final long serialVersionUID = 1L;
private static final AtomicLong atomicRefId = new AtomicLong();
// transient field is not serialized
private transient long refId;
// default constructor will be called on base class even during deserialization
public ObjBase() {
refId = atomicRefId.incrementAndGet()
}
public long getRefId() {
return refId;
}
}
답변
// looking for that last hex?
org.joda.DateTime@57110da6
당신이에 찾고 있다면 hashcode
당신이 할 자바 타입 .toString()
객체에 기본 코드는 이것이다 :
Integer.toHexString(hashCode())