2010-11-16 16 views
13

Wird in jedem Szenario ein String() - Konstruktor als String-Literal verwendet? Die Verwendung von String-Literalen ermöglicht die Wiederverwendung vorhandener Objekte. Warum brauchen wir also den öffentlichen Konstruktor? Gibt es eine reale Welt? ZB zeigen beide Literale auf das gleiche Objekt.Warum ist der Konstruktor String() nicht privat?

Antwort

18

Ein Beispiel, wo der Konstruktor einen nützlichen Zweck hat: von String.substring() erstellt Strings die zugrunde liegenden char[] der String teilt sie erstellt sind. Wenn Sie also eine String der Länge 10.000.000 haben (20MB Speicher belegen) und die ersten 5 Zeichen als Teilzeichenfolge verwenden, dann verwerfen Sie die ursprüngliche String, diese Teilzeichenfolge behält das 20MB-Objekt weiterhin für die Garbage Collection. Wenn Sie den String-Konstruktor verwenden, vermeiden Sie dies, da nur der Teil des zugrunde liegenden char-Arrays kopiert wird, der tatsächlich von der String-Instanz verwendet wird.

Natürlich, wenn Sie eine Menge von Teil des gleichen String erstellen und verwenden, vor allem, wenn sie sich überlappen, dann würden Sie sehr viel wollen, dass sie die zugrunde liegenden char[] teilen und den Konstruktor wäre kontraproduktiv.

+0

Das war eine harte Lektion für mich vor etwa 5 Jahren gelernt. –

+0

Es war eine schöne Vorlesung, aber es beantwortet keine Frage aus dem Header: "Warum ist nicht String-Konstruktor * privat *?" String_sring() kann all seine Optimierungen mit dem privaten Konstruktor als Methode der Klasse String implementieren. Die Frage ist, warum ist dieser Konstruktor öffentlich ?! – AlexR

+1

@AlexR: Lesen Sie die Antwort erneut, insbesondere den letzten Satz des ersten Absatzes. –

0

Weil manchmal möchten Sie vielleicht eine Kopie erstellen und nicht nur einen neuen Verweis auf die gleiche Zeichenfolge haben.

+0

Können Sie ein Beispiel für ein solches Szenario geben? – cdhowie

+3

Ich habe heute Morgen eine Frage über eine WeakHashMap gesehen, die eine HashMap ist, die ein Element automatisch entfernt, wenn sein Schlüssel Garbage Collection ist. Es stellte sich heraus, dass Sie String-Literale nicht als Schlüssel für diese verwenden sollten, da sie nie wieder zurückgewonnen werden würden. –

3

Da die Zeichenfolge unveränderlich ist, behalten Operationen wie die Teilzeichenfolge die ursprüngliche Zeichenfolge bei, die möglicherweise lang ist. Wenn Sie den Konstruktor zum Erstellen einer neuen Zeichenfolge aus der Teilzeichenfolge verwenden, wird eine neue Zeichenfolge erstellt, und Sie können die alte Zeichenfolge (in GC) löschen. Auf diese Weise könnte der benötigte Speicher freigegeben werden.
Beispiel:

String longS = "very long"; 
String shortS = new String(longS.substring(4)); 
+0

@Erick: Nein, nicht unbedingt identisch. Siehe Michaels Antwort. –

+0

@Erick: Ja, es wird, weil das zugrunde liegende Char-Array viel größer als die "sichtbaren" String-Inhalte sein kann. –

+0

Michael erklärt das besser. –

0

Alle guten Antworten hier, aber ich denke, es lohnt sich, darauf hinzuweisen, dass die Java Literale ganz anders behandelt als Strings die traditionelle Art und Weise konstruiert.

Dies ist a good Q/A darüber.

Verwandte Themen