Der einzige Ort, an dem Sie vielleicht denken, dass Sie möchten, new String(String)ist das Erzwingen einer eindeutigen Kopie des internen Zeichenarrays, wie in
small=new String(huge.substring(10,20))
Dieses Verhalten ist jedoch leider nicht dokumentiert und von der Implementierung abhängig.
Ich bin dadurch verbrannt worden, als ich große Dateien (einige bis zu 20 MiB) in einen String gelesen und nachträglich in Zeilen geschnitten habe. Am Ende hatte ich alle Zeichenfolgen für die Zeilen, die auf das Zeichen [] verweisen, das aus der gesamten Datei besteht. Leider wurde dadurch für die wenigen Zeilen, an denen ich mich länger als bei der Verarbeitung der Datei festhielt, ungewollt auf das gesamte Array verwiesen - ich musste es umgehen new String(), da die Verarbeitung von 20.000 Dateien sehr schnell sehr viel RAM verbrauchte.
Der einzige implementierungsunabhängige Weg, dies zu tun, ist:
small=new String(huge.substring(10,20).toCharArray());
Dies muss das Array leider zweimal kopieren, einmal für toCharArray()und einmal im String-Konstruktor.
Es muss eine dokumentierte Möglichkeit geben, einen neuen String zu erhalten, indem die Zeichen eines vorhandenen Strings kopiert werden. oder die Dokumentation von String(String)muss verbessert werden, um sie expliziter zu machen (es gibt eine Implikation, aber sie ist ziemlich vage und offen für Interpretationen).
Fallstricke der Annahme, was der Doc nicht sagt
Beachten Sie als Antwort auf die Kommentare, die immer wieder eingehen, die Implementierung von Apache Harmony new String():
public String(String string) {
value = string.value;
offset = string.offset;
count = string.count;
}
Das ist richtig, keine Kopie des zugrunde liegenden Arrays dort. Und dennoch entspricht es der (Java 7) String-Dokumentation, indem es:
Initialisiert ein neu erstelltes String-Objekt so, dass es dieselbe Zeichenfolge wie das Argument darstellt. Mit anderen Worten, die neu erstellte Zeichenfolge ist eine Kopie der Argumentzeichenfolge. Sofern keine explizite Kopie des Originals erforderlich ist, ist die Verwendung dieses Konstruktors nicht erforderlich, da Strings unveränderlich sind.
Das markante Stück ist „Kopie des Arguments Zeichenfolge “; Es heißt nicht "Kopie der Argumentzeichenfolge und des zugrunde liegenden Zeichenarrays, das die Zeichenfolge unterstützt".
Achten Sie darauf, dass Sie auf die Dokumentation und nicht auf eine Implementierung programmieren .