it-swarm.com.de

drucken der Adresse der String-Instanzen

package com.testProject;
public class JavaSample {

    public static void main(String[] args) {

        String myString1 = new String("Sample1");
        System.out.println(myString1);
        String myString2 = new String("Sample2");
        System.out.println(myString2);
    }
}

in dem obigen Codeteil, wie die Adresse dieser Strings gedruckt werden soll, die ich "Sample1" und "Sample2" erstellt habe, muss der Speicherort des String-Objekts myString1 und myString2 gedruckt werden

16
user1396008

Wenn Sie "Adresse" so meinen:

System.out.println(new Object());

[email protected] 31ec0130

dann kannst du einfach tun,

String s = new String("one");
System.out.println(Integer.toHexString(s.hashCode()));

1ae66

Da Sie glauben, dass die "Adresse" nur der in Hex-String konvertierte hashCode () ist.


Randnotiz
Diese Antwort wurde historisch als korrekt akzeptiert und funktioniert nur für Klassen, die hashCode().__ nicht überschreiben. Methode, aber (wie in Kommentaren erwähnt) funktioniert es nicht für String Klassen , da sie die hashCode()-Methode überschreiben. Leser suchen nach aktuellem Informationen zum Thema dieser Frage sollten zunächst alle durchgehen die Kommentare/Diskussion zu dieser Antwort und sollten weiter konsultieren Ressourcen oder stellen Sie eine neue Frage, die diese Frage und Antwort zitiert, und explizit nach neuen Informationen zu veränderten Dingen fragen da wurden sie geschrieben.

6
renz

Wie auf meinen Kommentar hingewiesen, ist dies keine empfohlene Übung, aber da Sie gefragt haben ...

private static Unsafe unsafe;

static
{
    try
    {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        unsafe = (Unsafe)field.get(null);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

public static long addressOf(Object o)
throws Exception
{
    Object[] array = new Object[] {o};

    long baseOffset = unsafe.arrayBaseOffset(Object[].class);
    int addressSize = unsafe.addressSize();
    long objectAddress;
    switch (addressSize)
    {
        case 4:
            objectAddress = unsafe.getInt(array, baseOffset);
            break;
        case 8:
            objectAddress = unsafe.getLong(array, baseOffset);
            break;
        default:
            throw new Error("unsupported address size: " + addressSize);
    }       

    return(objectAddress);
}
12
hd1

es scheint, als ob Sie alle UNKORREKT sind! Ich versuche zu erklären: 

        String s = new String("hi Mr. Buddy");
//        s = = "hi Mr. Buddy"; //is false
//        s.equals("hi Mr. Buddy"); //is true
        System.out.println( s.hashCode() );
        System.out.println( "hi Mr. Buddy".hashCode() );

        System.out.println( "hi Mr. Buddy" == s );

        System.out.println( "hi Mr. Buddy" );

ergebnis davon in meinem Fall: 

1372880496
1372880496
false
hi Mr. Buddy

Wie wir sehen, sind die hashCode () gleich, aber String hat unterschiedliche Adressen (bcs "hi Mr. Buddy" == s >> == false) ? was denkst du ?

Ich fand : 

System.out.println( "s=" + System.identityHashCode( s ) );
System.out.println( "..=" + System.identityHashCode( "hi Mr. Buddy" ) );

das Ergebnis ist: 

s=733003674
..=1626549726
9
AnNik

Speicheradressen sind in der Regel nicht über die Java-Sprache verfügbar, System.identityHashCode(myString1) kann jedoch nahe genug sein, je nachdem, was Sie erreichen möchten.

8
msandiford

Eigentlich kannst du nicht. Die JVM übernimmt den Speicher, und der GC kann die Daten verschieben, wenn er es für richtig hält. 

Es gibt also kein "reales" Konzept einer Speicheradresse in Java (dies ist nur das Anliegen der JVM)

1
Aniket Inge

Warum verwenden Sie nicht printf mit% b:

String s= new String("Hello");
System.out.println(Integer.toHexString(s.hashCode()));
System.out.printf("address of the reference variable s holding string \"%s\" is %h%n", s,s);
0
chikitin

Ich denke die Antwort von @AnNik sollte als korrekte Antwort betrachtet werden. Unten ist der Vergleich,

   String s1= "abc";
    String s2 = new String("abc");
    String s3= "abc";


    System.out.println(Integer.toHexString(s1.hashCode()));
    System.out.println(Integer.toHexString(s2.hashCode()));
    System.out.println(Integer.toHexString(s3.hashCode()));
    System.out.println(System.identityHashCode(s1));
    System.out.println(System.identityHashCode(s2));
    System.out.println(System.identityHashCode(s3));

Ausgabe: 

17862
17862
17862
356573597
1735600054
356573597
0
Chintan Pandya