Vor kurzem habe ich entdeckt, dass die Methode java.lang.String.substring keine neue Zeichenkette zurückgibt, sondern eine Ansicht der ursprünglichen Zeichenkette, die geteilt wurde. Dies kann Auswirkungen auf den Speicher haben. Wenn Sie z.B. eine ASCII-Datei lesen, die Token in der Datei mit substring analysieren und das Ergebnis von substring irgendwo im Speicher ablegen, speichern Sie eigentlich die gesamte Zeichenkette vor der substring-Operation im Speicher! Sie können dieses Problem natürlich lösen, indem Sie substring in eine eigene Version verpacken, die eine neue Zeichenkette mit dem Ergebnis von substring zurückgibt.
Antworten
Zu viele Anzeigen?Mich hat es schon einmal erwischt, als ich eine Wörterbuchdatei Zeile für Zeile gelesen habe. Jede Zeile war sehr kurz, aber der Puffer, der von BufferedReader
bedeutete, dass jede Zeichenkette von einem 80-Zeichen-Array unterstützt wurde.
Damals lernte ich zum ersten Mal, worum es beim Schreiben geht:
word = new String(word);
Die meiste Zeit ist das aber kein Problem - und natürlich ist es 缶 effizienter sein als der Ansatz "eine völlig separate Kopie erstellen".
Im Jahr 2000 oder 2001 wurde eine der ersten XML
Parser (ich kann mich nicht mehr erinnern, welche) litten unter diesem Problem. Wir haben eine Weile gebraucht, um herauszufinden, wie wir aus dem Speicher gehen, indem wir etwa 3 Felder aus einigen frühen FpML
(sehr groß XML
Dokumente, die Finanzprodukte beschreiben).
Was wirklich ärgerlich ist, ist die Tatsache, dass ein Schreiben
String copy = new String(s);
IntelliJ IDEA warnt mich, dass dies redundant ist! Blöde IDE.
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
In den Java-Dokumenten heißt es, dass die substring-Methode eine neue Zeichenfolge zurückgibt.
Oder habe ich die Frage falsch verstanden?
Außerdem sind Zeichenketten unveränderlich. Hier ist ein SO-Thread, der erklärt, warum das so ist.