[java] hashCode ()를 재정의하는 객체의 고유 ID를 얻는 방법은 무엇입니까?

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())