아래 그림을 참조하십시오. new
키워드를 사용하여 java에서 객체를 만들면 OS에서 메모리 주소를 얻습니다.
우리가 쓸 때 out.println(objName)
"특별한"문자열을 출력으로 볼 수 있습니다. 내 질문은 :
- 이 결과는 무엇입니까?
OS가 우리에게 제공 한 메모리 주소 인 경우 :
a)이 문자열을 이진수로 어떻게 변환 할 수 있습니까?
b) 하나의 정수 변수 주소를 어떻게 얻을 수 있습니까?
아래 그림을 참조하십시오. new
키워드를 사용하여 java에서 객체를 만들면 OS에서 메모리 주소를 얻습니다.
우리가 쓸 때 out.println(objName)
"특별한"문자열을 출력으로 볼 수 있습니다. 내 질문은 :
OS가 우리에게 제공 한 메모리 주소 인 경우 :
a)이 문자열을 이진수로 어떻게 변환 할 수 있습니까?
b) 하나의 정수 변수 주소를 어떻게 얻을 수 있습니까?
답변:
클래스 이름과 System.identityHashCode () 는 '@'문자로 구분됩니다. 아이덴티티 해시 코드가 나타내는 것은 구현에 따라 다릅니다. 종종 개체의 초기 메모리 주소이지만 시간이 지남에 따라 VM에서 개체를 메모리에서 이동할 수 있습니다. 따라서 (간결하게) 아무것도 아닌 것에 의존 할 수 없습니다.
JVM이 객체를 구현하고 적절하게 보이는대로 자유롭게 움직일 수 있기 때문에 변수의 메모리 주소를 얻는 것은 의미가 없습니다 (가비지 수집 중에 객체가 움직일 수 있음).
Integer.toBinaryString () 은 이진 형식의 정수를 제공합니다.
identityHashcode
의미가없는 것은 아닙니다. :)
그것은 가능합니다 sun.misc.Unsafe
: @ Peter Lawrey의 훌륭한 답변을보십시오-> 참조 주소를 얻는 방법이 있습니까?
printAddresses () 코드를 사용하여 :
public static void printAddresses(String label, Object... objects) {
System.out.print(label + ": 0x");
long last = 0;
int offset = unsafe.arrayBaseOffset(objects.getClass());
int scale = unsafe.arrayIndexScale(objects.getClass());
switch (scale) {
case 4:
long factor = is64bit ? 8 : 1;
final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor;
System.out.print(Long.toHexString(i1));
last = i1;
for (int i = 1; i < objects.length; i++) {
final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor;
if (i2 > last)
System.out.print(", +" + Long.toHexString(i2 - last));
else
System.out.print(", -" + Long.toHexString( last - i2));
last = i2;
}
break;
case 8:
throw new AssertionError("Not supported");
}
System.out.println();
}
이 테스트를 설정했습니다.
//hashcode
System.out.println("Hashcode : "+myObject.hashCode());
System.out.println("Hashcode : "+System.identityHashCode(myObject));
System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode()));
//toString
System.out.println("toString : "+String.valueOf(myObject));
printAddresses("Address", myObject);
출력은 다음과 같습니다.
Hashcode : 125665513
Hashcode : 125665513
Hashcode (HEX) : 77d80e9
toString : java.lang.Object@77d80e9
Address: 0x7aae62270
결론 :
Sunil이 말했듯 이 이것은 메모리 주소 가 아니며 해시 코드 일뿐입니다.
동일한 @ 컨텐츠를 얻으려면 다음을 수행하십시오.
해당 클래스에서 hashCode가 재정의되지 않은 경우 :
"@" + Integer.toHexString(obj.hashCode())
hashCode가 재정의되면 다음을 사용하여 원래 값을 얻습니다.
"@" + Integer.toHexString(System.identityHashCode(obj))
hashCode ()를 재정의하지 않으면 해시를 계산하는 데 메모리 주소가 사용되므로 메모리 주소와 혼동되는 경우가 많습니다.
이것은 java의 해시 코드에 대해 알고 유용합니다.
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
당신은 같은 클래스에서 개체를 만들 때 자바에서 Person p = new Person();
, p
사실의 종류를 가리키는 메모리 위치의 주소입니다 Person
.
statemenet을 사용하여 인쇄 p
하면 주소가 표시됩니다. new
키 워드에 포함 된 모든 인스턴스 변수 및 방법 함유하는 새로운 메모리 위치하게 class Person
하고 p
해당 메모리 위치를 가리키는 참조 변수이다.