programing

Java에서 변수의 메모리 주소

prostudy 2022. 4. 15. 21:35
반응형

Java에서 변수의 메모리 주소

아래 사진 좀 봐줘.를 사용하여 Java에서 객체를 생성할 때new키워드, OS에서 메모리 주소를 받고 있어.

우리가 쓸때out.println(objName)출력물로 "특수" 문자열을 볼 수 있다.내 질문은:

  1. 이 출력물은 무엇인가?
  2. OS에서 제공하는 메모리 주소인 경우:

    a) 이 문자열을 2진수로 변환하려면 어떻게 해야 하는가?

    b) 정수 변수 주소 하나를 얻는 방법은?

alt 텍스트

그것은 클래스 이름과 시스템.identity이다.해시코드()는 '@' 문자로 구분된다.ID 해시 코드가 나타내는 것은 구현별이다.이 주소는 종종 개체의 초기 메모리 주소지만, 시간이 지남에 따라 VM에 의해 개체가 메모리로 이동될 수 있다.그러니 (간단히) 그 무엇이라고 기댈 수는 없다.

JVM은 자유롭게 객체를 구현하고 적합해 보이는 대로 객체를 이동할 수 있으므로(가비지 수집 중 객체가 이동할 수 있거나 이동할 수 있음) 변수의 메모리 주소를 Java 내에서 얻는 것은 의미가 없다.

정수.toBinaryString()은 이진 형식으로 정수를 제공한다.

는 것은 가능하다.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

결론 :

  • 해시코드 != 주소
  • toString = class@HEX(해시 코드)

그것은 오브젝트의 "toString()" 구현의 결과물이다.만약 당신의 클래스가 String()을 무시한다면, 그것은 완전히 다른 것을 인쇄할 것이다.

이것은 메모리 주소가 아니다. 이것은 classname@hashcode이다.
다음 중 어느 것이 기본 구현인가?

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

어디에

Class name= 전체 정규화된 이름 또는 절대 이름(즉, 패키지 이름 뒤에 클래스 이름)hashcode= 16진수 형식(System.identity)해시코드(obj) 또는 obj.hashCode()는 10진수 형식의 해시코드를 제공한다.

힌트:
혼동 근본 원인은 개체의 내부 주소를 정수로 사용하는 기본 구현이다.

이는 일반적으로 객체의 내부 주소를 정수로 변환하여 구현되지만, 이 구현 기법은 자바™ 프로그래밍 언어에 의해 요구되지 않는다.

물론 일부 클래스는 다음 두 가지 기본 구현을 모두 재정의할 수 있다.toString()또는hashCode()

이 기계의 하다면.hashcode()그 위에 있는 대상을 위해
다음 방법을 사용할 수 있다.

선일이 말대로 이건 기억주소가 아니야.이건 그냥 해시코드야

동일한 @ 내용을 얻으려면 다음을 수행하십시오.

해당 클래스에서 hashCode가 재정의되지 않은 경우:

"@" + Integer.toHexString(obj.hashCode())

hashCode가 재정의된 경우 다음을 사용하여 원래 값을 얻으십시오.

"@" + Integer.toHexString(System.identityHashCode(obj)) 

해시코드()를 재정의하지 않으면 메모리 주소가 해시를 계산하는 데 사용되기 때문에 메모리 주소와 혼동되는 경우가 많다.

당신이 얻고 있는 것은 오브젝트 클래스의 toString() 메서드의 결과 또는 더 정확히 말하면 정체성의 결과물이다.uzay95가 지적한 해시코드().

"새로운 키워드로 Java에서 객체를 만들 때 OS로부터 메모리 주소를 받고 있다."

자바에서 하는 모든 일은 자바 가상 머신이 처리한다는 것을 깨닫는 것이 중요하다.이 정보를 제공하는 것은 JVM이다.호스트 운영 체제의 RAM에서 실제로 일어나는 일은 전적으로 JRE의 구현에 달려 있다.

이것은 Java의 해시코드에 대해 아는 데 유용하다.

http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/

Printing object reference인 Javadoc에 따르면, 내부적으로 Object 클래스에서 toString() 메서드를 호출하기 때문에 객체의 문자열 표현을 반환할 것이다.여기에 이미지 설명을 입력하십시오.

Java에서는 다음과 같은 클래스로 객체를 만들 때Person p = new Person();p인데, 위치의 과 같다.Person.

상태 정보를 사용하여 인쇄하는 경우p주소를 보게 될 것이다.new키 워드는 에 포함된 모든 인스턴스 변수 및 방법을 포함하는 새로운 메모리 위치를 만든다.class Person그리고p해당 메모리 위치를 가리키는 기준 변수.

참조URL: https://stackoverflow.com/questions/1961146/memory-address-of-variables-in-java

반응형