3 Stimmen

Wie viele Menschen wurden von Java-Substring-Speicherproblemen gestochen?

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.

11voto

Jon Skeet Punkte 1325502

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".

1voto

oxbow_lakes Punkte 131223

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.

0voto

Sev Punkte 14803

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X