2015-10-17 23 views
5

Wie pro mein VerständnisWas von String s = new String benötigen wird ("abc"), wenn wir String erstellen s = "abc"

String s = new String("abc") schaffen wird zwei Objekte-

  1. ein in String konstanten-Pool (wenn "abc" nicht bereits in constant pool)
  2. ein in Heap-Speicher

Obwohl mehr als Verständnis existiert darüber, wie viele Objekte tatsächlich b e erstellt und wo.

Auf jeden Fall habe ich folgende Fragen -

  1. Warum ist es nicht in Java-Dokumentation der Klasse String bedeckt darüber, wie viele Objekte werden erstellt und wo?
  2. Warum wird new String(String) sowieso in der String-Klasse zur Verfügung gestellt Strings sind unveränderlich?. Kann auch davon ausgegangen werden, dass alle Strings, erstellt entweder String s = "abc" oder String s = new String("abc"), in String Constant Pool verfügbar sein?
  3. Die Zeichenfolgenliterale, die beim Erstellen oder Anfügen in StringBuilder oder StringBuffer verwendet werden, werden auch im String-Konstantenpool verwendet, oder sie verbleiben nur im Heapspeicher.

bearbeiten

Java Dokumentation für intern() Methode spricht deutlich über konstant Pool, aber nichts gesagt wird, wie das in String(String).

+0

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

+0

@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

Antwort

7

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

+2

Downvoted. Beantwortet die Frage nicht wirklich und ist falsch. Das Erstellen einer Zeichenfolge aus einem char-Array ist nicht wirklich äquivalent zur Verwendung einer Konstante. Beispiel: '' 'String a =" x "; Zeichenfolge b = "x"; char [] ca = {'x'}; String c = new String (ca); '' 'Die Variablen a und b zeigen nun auf dasselbe Objekt, c zeigt jedoch auf ein anderes Objekt. Java-Strings sind auch Objekte. Sie sind nicht "zwischen" primitiven Typen und Referenztypen. Ja, Sie können den Operator + verwenden, aber das ist nur syntaktischer Zucker und hat nichts mit "Leistungsgründen" zu tun. Das Zeug über "gültige Art der Erklärung" macht keinen Sinn. –

+1

Will versuchen, Ihre Fragen zu beantworten: 1) Ich habe nie gesagt, dass es gleich Char Array ist. Also von deiner Seite, die offiziellen API-Dokumente verlinkt oder falsch? 2) Java-Strings sind Objects. Daran besteht kein Zweifel. Es sieht einfach wie ein primitiver Deklarationstyp aus und für den Konstantenpool (Leistungsoptimierung nach Sprache). 3) 'aber das ist nur syntaktischer Zucker und hat nichts mit" Leistungsgründen "zu tun. Das habe ich in meiner Antwort nie erwähnt. 4) Gültige Weg-ID über die Objektdeklaration wie jedes andere Objekt im Gegensatz zum literalen Stil. Hoffnung, die sich löscht. –

+1

1) Ja, streng genommen ist das offizielle API-Dokument falsch. Das Beispiel im Dokument soll die Unveränderlichkeit veranschaulichen, und in dieser Hinsicht sind die Strings äquivalent, auf andere Weise jedoch nicht. 2) Ich verstehe es nicht.3) Ich nahm an, Sie haben das Gefühl, dass Strings wie Primitive sind, weil sie Operanden sein können. Es tut uns leid. 4) Ich verstehe es nicht. –

1

String s = new String ("abc") zwei Objekte erstellen wird:

  • ein in Zeichenkette Pool (wenn „abc "nicht bereits in constant pool)

Nein, es ist im konstanten Pool . Es wurde vom Compiler dorthin gebracht.

  • eine Heap-Speicher in

Correct.

Obwohl mehr als Verständnis darüber existiert, wie viele Objekte tatsächlich erstellt werden und wo.

Viele Missverständnisse: nur ein richtiges Verständnis.

Warum wird in den Java-Dokumenten der String-Klasse nicht beschrieben, wie viele Objekte erstellt werden und wo?

Die Prämisse der Frage ist nicht korrekt. Es ist bedeckt. Nicht in der genauen Form, wie viele Strings erstellt werden, aber wie die Frage in den letzten 20 Jahren Millionen von Malen gestellt wurde, ist die Antwort kein Geheimnis. Oder sollte nicht sein.

Warum neue String (String) wird in String-Klasse zur Verfügung gestellt, vorausgesetzt, Strings sind unveränderlich ?.

Sie können also eine neue erstellen.

Kann auch davon ausgegangen werden, dass alle Strings, die entweder mit String s = "abc" oder String s = new String ("abc") erstellt wurden, in String constant pool verfügbar sind?

Nein, nur Stringliterale und das Ergebnis der String.intern() ist im konstanten Pool. Und das ist auch dokumentiert.

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.

Alle String-Literale werden vom Compiler in den Konstantenpool gestellt.

+0

Zu Ihrem ersten Punkt, 'Nein. Es ist im konstanten Pool. Es wurde vom Compiler dorthin gestellt. Wie könnte Compiler? Laut java docs der 'intern()' Methode 'Ein Pool von Strings, der anfänglich leer ist, wird privat von der Klasse String gepflegt.' Klarerweise ist die Objekterzeugung ein Prozess der Laufzeit und in der tatsächlichen JVM Instanz. Und zu deinem fünften Punkt 'So kannst du einen neuen erstellen.Warum würde ich einen neuen String erstellen, wenn ich diesen unveränderlichen String bereits habe? –

+1

@sarvesh Er wird vom Compiler in den Konstantenpool der .class-Datei geschrieben, und die String-Literale in den Konstantenpools aller .class-Dateien werden vom Classloader in den Laufzeit-String-Pool konsolidiert. – EJP

+0

Das sieht überzeugend aus. Vielen Dank. –

Verwandte Themen