Warum ist es nicht in Java-Dokumentation der Klasse String bedeckt darüber, wie viele Objekte erstellt und wo werden?
Es wird in Docs of String
Die String-Klasse repräsentiert Zeichenketten bedeckt. Alle String-Literale in Java-Programmen wie "abc" sind als Instanzen dieser Klasse implementiert. Strings sind konstant; Ihre Werte können nicht geändert werden, nachdem sie erstellt wurden. Zeichenfolgenpuffer unterstützen veränderbare Zeichenfolgen. Da String-Objekte unveränderbar sind, können sie gemeinsam genutzt werden. Zum Beispiel:
String str = "abc";
entsprechen:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
Und von dem Java language specification
ein String-Objekt hat einen konstanten (unveränderlichen) Wert.
String-Literale (§3.10.5) sind Verweise auf Instanzen der Klasse String.
Und von JSL # 3.10.5. String Literals
Darüber hinaus bezieht sich ein Stringliteral immer auf die gleiche Instanz der Klasse String. Dies liegt daran, dass String-Literale - oder allgemeiner gesagt, Strings, die die Werte von konstanten Ausdrücken sind (§15.28) - "interniert" sind, um eindeutige Instanzen mit der Methode String.intern zu teilen.
.
Warum new String (String) sind ohnehin in String-Klasse bereitgestellt wird Strings unveränderlich? .Auch kann davon ausgegangen werden kann, dass alle Strings, entweder String s = "abc" oder String s = new String erstellt ("abc"), wird im String constant pool verfügbar sein?
Da String ist die gültige Art und Weise der Erklärung Objekt ist
String s = new String("abc");
Aber wo String s = "abc";
aus anderen Gründen ausgelegt ist
Die Entwickler von Java primitiven Typen in einer objektorientierten Sprache zu halten beschlossen , anstatt alles zu einem Objekt zu machen, um die Leistung der Sprache zu verbessern.
Da dies die nützlichste Klasse ist Aus Gründen der Leistung ist Java's String so aufgebaut, dass er zwischen einem Primitiv und einer Klasse liegt.
Die String-Literale, die beim Erstellen oder Anfügen in StringBuilder oder StringBuffer verwendet werden, werden auch im String-Konstantenpool verwendet oder sie verbleiben nur im Heap-Speicher.
Betrachten Sie das Beispiel
StringBuilder sb = new StringBuilder("abc");
Die wörtliche "abc"
in constant pool und dem Objekt sb
im Heap erstellt. meine alte Antwort
ein Schuss zu lesen: How can a string be initialized using " "?
WRT "die Notwendigkeit": Es ist nahe 0. Ich erinnere mich nicht daran, es in den letzten Jahren zu verwenden. Vielleicht, um zu testen, dass es keinen fehlerhaften '== 'Vergleich oder andere seltsame Gründe gibt, wie ein sicheres Lock-Objekt, das sich auch selbst ausdruckt. Die automatische Codeanalyse könnte Sie sogar davor warnen. – zapl
@zapl - In der Vergangenheit hatte der Konstruktor einen echten Zweck - eine Kopie mit einem kleineren Char-Array zu erstellen. siehe http://stackoverflow.com/q/16123446/2158288 – ZhongYu