2016-05-14 14 views
4

So las ich String-Klasse, als ich auf einem verwirrenden Konstruktor stolperte. Der Code geht soEmpty Konstruktor in String-Klasse

public final class String 
    implements java.io.Serializable, Comparable<String>, CharSequence { 

    /** The value is used for character storage. */ 
    private final char value[]; 

    /** Initializes a newly created {@code String} object so that it represents 
    * an empty character sequence. Note that use of this constructor is 
    * unnecessary since Strings are immutable. 
    */ 
    public String() { 
     this.value = "".value; 
    } 
// the rest of the class code 
} 

Ich verstehe nicht, was

"".value;

zu tun hat. Was ist das ""? Ist es ein neues String object? Wenn ja, mit welchem ​​Konstruktor?

+3

dies bedeutet String mit 0 Länge – emotionlessbananas

+0

Dies ist einfach String-Literal-Objekt befindet sich im String-Pool .. Siehe http://StackOverflow.com/Questions/3052442/what-is-the-Differenz-between-text-and- new-stringtext –

+0

Können Sie einen Link zu dem betreffenden Code angeben? Weil OpenJDK [7] (http://hg.openjdk.java.net/jdk7/jdk7/jdk/datei/9b8c96f96a0f/src/teilen/klassen/java/lang/String.java # l151) und [8] (http://hg.openjdk.java.net/jdk8/jdk8/jdk /file/687fd7c7986d/src/share/classes/java/lang/String.java#l138) habe 'this.value = new char [0];'. – dhke

Antwort

1

Was ist das ""? Ist es ein neues String-Objekt?

Es ist eine leere Zeichenfolge. Es muss nicht neu sein und höchstwahrscheinlich nicht, da Zeichenfolgenliterale interned sind.

Wenn es ist, mit welchem ​​Konstruktor?

Beim Kompilieren wurde die leere Zeichenkette wahrscheinlich Scanner von einem sequence of input charactersString(char[], int, int) unter Verwendung von Quellcode erstellt.

Zur Laufzeit hat die ClassLoader die Zeichenfolge aus der Klassendatei in nativem Code wahrscheinlich über java_lang_String::create_from_unicode() und Freunde geladen und interniert.

Warum verwenden "": Es ist eine Speicherauslastung Optimierung. Da Zeichenfolgenliterale interned sind, ist "".value eine Referenz auf dasselbe zugrunde liegende char-Array für jede leere Zeichenfolge.

Von den Repositorys wurde OpenJDK (7, 8) zuvor this.value = new char[0]; verwendet. Ein neues Char-Array-Objekt wurde für jede new String() erstellt, die im Quellcode erscheint (d. H. Hoffentlich nie).

Aktuelle OpenJDK 9 hat "".value.

Die Änderung verhindert das Erstellen eines neuen char-Arrays und speichert daher einige Bytes pro nicht internierter, aber neu erstellter leerer Zeichenfolge. Nach der Änderung teilen sich alle Zeichenketten der Länge Null das gleiche (Null-Länge) Char-Array.

Ich würde dies ein seltener Fall, weil ich mich nicht erinnern kann, wenn ich jemals new String() irgendwo verwendet habe.

+0

Ich sollte wirklich keine Kommentare um 3 Uhr schreiben, * mea culpa, * aber es gibt immer noch nicht so etwas wie * den * Java-Compiler. Zu beschreiben, was eine Implementierung tut, kann die Frage möglicherweise nicht richtig beantworten. – EJP

+0

@EJP Du bist da natürlich genau da, wo das * wahrscheinlich * reinkommt, was als Kurzform von * gelesen werden sollte. Wenn du den Standard-JDK-Compiler verwendest, dann ... *. Aber die Antwort kann auch ohne den Breadcrumb-Pfad von wo die Zeichenfolge kommt in erster Linie auskommen. – dhke

0

"" ist eine String und hat somit eine char[] values wie jede String würde. Es hat jedoch keine Zeichen, wodurch values ein leeres Array wird.

Grundsätzlich initialisiert der Code values zu einem leeren Array.