Double / Double - Rechenproblem

Nein ein String kann man aber als primitiven ansehen da er überschriebene Operatoren hat und somit sich eine Zeichenkette einfach einem String zuweisen lässt.

Java:
String text = "Hallo";
ist völlig ausreichend.
Java:
String text2 = new String("Hallo");

überflüssig denn "Hallo" ist ja schon ein String. New legt nur unsinnigerweise ein neues Objekt an. Im Übrigen werden
Java:
String test1 = "Hallo";
String test2 = "Hallo";
intern auf den selben Speicherbereich abgebildet (das heisst nicht dass man mit == ergleichen kann. Das sollte man bei String nur mit den equals Methoden tun). Hallo liegt also nur einmal im Speicher was ja bei langen Zeichenketten ein recht speichersparendes Verhalten ist.
 
Java:
String test1 = "Hallo";
String test2 = "Hallo";
intern auf den selben Speicherbereich abgebildet (das heisst nicht dass man mit == ergleichen kann. Das sollte man bei String nur mit den equals Methoden tun). Hallo liegt also nur einmal im Speicher was ja bei langen Zeichenketten ein recht speichersparendes Verhalten ist.


Wow echt? Java ist ja geil ;)
Und wenn ich den test2 jetzt abändere wird dieser automatisch "gecloned" ? Was dann aber wieder zu Performanceeinbusen führen kann (wobei natürlich nicht im grossen Style)


Nun mal ein Beispiel aus der Praxis:
Ich muss ein int in einen String umwandeln

entweder:
Java:
String blah = ((Object)rs.getInt(1)).toString()

oder:
Java:
String blah = ((Integer)rs.getInt(1)).toString();

Wenn ich das jetzt richtig verstanden habe, kommt es nicht draufan welche der oberen Varianten ich nehme, hauptsache nicht folgende:
Java:
String blah = new Integer(rs.getInt(1)).toString()

right?
 
Hmm nee am Besten nimmst du Integer.toString(rs.getInt(1)).

Alle primitiven numerischen typen haben ja einen passenden Objekttyp. Und diese bieten alle die Methoden toString(primitiverTyp) an.
 
Hmm ok danke.

Ich will dir jetzt nicht auf die Nerven gehen.. aber was ist denn der Unterschied zwischen
((Integer)rs.getInt(1)).toString()
und
Integer.toString(rs.getInt(1))
?
 
Und wenn ich den test2 jetzt abändere wird dieser automatisch "gecloned" ? Was dann aber wieder zu Performanceeinbusen führen kann (wobei natürlich nicht im grossen Style)
So in der Art. Strings sind in Java grundsätzlich unveränderbar. Man kann also in einem Stringobjekt keine Zeichen ersetzen oder gar Zeichen anfügen.

Im Übrigen werden
Java:
String test1 = "Hallo";
String test2 = "Hallo";
intern auf den selben Speicherbereich abgebildet (das heisst nicht dass man mit == ergleichen kann. Das sollte man bei String nur mit den equals Methoden tun).
Man kann Strings schon mit == vergleichen – aber nur wenn man sie vorher via intern() in den Stringpool verfrachtet hat. Das kann in manchen Fällen durchaus Sinn machen.

Ich will dir jetzt nicht auf die Nerven gehen.. aber was ist denn der Unterschied zwischen
((Integer)rs.getInt(1)).toString()
und
Integer.toString(rs.getInt(1))
?
Bei ersterem erzeugst du ein neues Objekt der Klasse Integer im Speicher und rufst dessen Methode toString() auf. Im Prinzip ist das identisch mit (new String(rs.getInt(1))).toString() (würde mich nicht wundern, wenn bei beiden sogar der gleiche Bytecode rauskommt).

Bei der zweiten Methode wird kein neues Integer-Objekt im Speicher erzeugt. Es wird lediglich die statische Methode toString() der Klasse Integer aufgerufen, die direkt die Stringrepräsentation des int-Werts ermittelt.

Grüße,
Matthias
 
Zurück