Wie kann man bei einem String herausfinden auf welches Objekt er zeigt?



  • Hallo,

    normalerweise kann man ja bei neu erstellten klassen herausfinden
    wo so ein Objekt hinzeigt wenn man die toString() Methode noch nicht
    überschrieben hat.

    Aus einem

    Punkt bla = new Punkt();
    System.out.println(bla.toString());
    

    erhält man ein
    xy@283313
    als Ergebnis.

    Jetzt hätte ich gerne das gleiche für einen normalen String.

    D.h. ich habe 4 Strings wie z.B.

    String str1 = new String("Yahoo");
    String str2 = new String("Yahoo");
    String str3 = "Yahoo";
    String str4 = "Yahoo";

    Und davon möchte ich jetzt ihre Addresse im Heap haben.
    Wie mache ich das, eine toString() Methode gibt es bei normalen
    Strings nämlich logischerweise nicht.


  • Mod

    Das kann ich dir auf anhieb so nicht beantworten. (vielleicht super.toString()?)

    Mich würde aber mal interessieren, für was du das benötigst. IMHO gibt es dafür keinen vernünftigen Anwendungsfall.



  • Dieses Point@82ba41 ist nicht die Angabe der Speicheradresse sondern der HashCode des Objekts. Ob in diesen HashCode die Speicheradresse mit aufgenommen wird (was sein kann ich aber bezweifle) weiss ich nicht. Zur Probe:

    public class heap {
    	public static void main (String args[]) {
    		Points p = new Points();
    
    		System.out.println(p.hashCode());
    		System.out.println(p);
    	}
    }
    
    class Points
    {
    	int x;
    	int y;
    }
    

    Beachte mal die erste Ausgabezeile und rechne die dort stehende Zahl in Hex um ...



  • Sollte der Hashcode für für gleiche (equals) Objekte nicht gleich sein? Dann kann es schon gar nichts mehr mit der Adresse zu tun haben.

    If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.



  • Hätte mich auch sehr verwundert... denn Low-Level Speicherverwaltung geht ja (aus gutem Grund) in Java nicht...



  • Optimizer schrieb:

    Sollte der Hashcode für für gleiche (equals) Objekte nicht gleich sein? Dann kann es schon gar nichts mehr mit der Adresse zu tun haben.

    Zitat aus der API Doku

    As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

    Die Adresse wird also wahrscheinlich benutzt werden, man sollte sich aber nicht drauf verlassen.

    Manfred2 schrieb:

    Aus einem

    Punkt bla = new Punkt();
    System.out.println(bla.toString());
    

    erhält man ein
    xy@283313
    als Ergebnis.

    Jetzt hätte ich gerne das gleiche für einen normalen String.

    Das ist kein Problem.

    String str="abc";
    System.out.println( str.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(str)));
    

    Damit bekommst du genau die gleiche Ausgabe wie mit der Object.toString() Methode.



  • @Zoidberg: Du hast den Text in der API missverstanden. hashCode MUSS gleiche codes für gleiche Objekte zurückliefern und SOLLTE verschiedene für verschiedene zurückliefern. Das erste ist aber eine Bedingung die erfüllt sein muss.
    Allerdings könnte bei Object.hashCode() tatsächlich die Adresse trotzdem eine Rolle spielen, da Object.equals() ja auch über die Identität definiert ist.



  • Optimizer schrieb:

    @Zoidberg: Du hast den Text in der API missverstanden. hashCode MUSS gleiche codes für gleiche Objekte zurückliefern

    Ich kann mich nicht erinnern etwas anderes behauptet zu haben.
    Ich bezog mich in meinem Posting auf die Aussage, dass die Adresse keine Rolle spielt, was sie laut API aber wahrscheinlich doch tut.



  • Oh, da war ich wohl grad verwirrt, als ich das geschrieben habe.


Anmelden zum Antworten