2016-04-13 4 views
0

ich nicht nur einen Code-Review ohne Grund für eine Funktion meines schriftlich Grund, wo s (vom Typ String) als Parameter übergeben wirdWas ist los mit neuen String?

if (s == null){ 
    s = new String(); 
} 

Said ich stattdessen s = ""; verwenden sollte. Warum?

+0

https://stackoverflow.com/questions/2486191/what-is-the-java-string-pool-and-how-is-s-different-from-new-strings –

+0

Ihre Frage ist unklar .. 's = new String();' kompiliert nicht. Was versuchst du genau zu machen? – TheLostMind

+0

U wot? Es tut in Java 7. –

Antwort

7

Sie könnten immer mit dem Gutachter klären?

new String();immer erstellt eine neue Zeichenfolge. (Ist die Java-Syntax nicht selbst erklärend?)

s = ""; wird den Verweis auf eine interne Zeichenfolge setzen und ist daher bevorzugt.

4

Es gibt eine Präferenz in der String Klasse, wenn sie mit Literalen über die Initialisierung mit dem Schlüsselwort new initialisiert, ist dies, weil die JVM Optimierungen, und weil die JVM ordnet mit Literale direkt in den StringPool initialisiert Strings.

+0

aber was, wenn '" "' in String Pool nicht verfügbar ist? –

+0

Die JVM wird dort eine neue leere Zeichenfolge zuweisen ... –

1

JVM es anders handhaben, wenn Sie anrufen:

  • s = new String(); // Der Konstruktor erstellt jedes Mal ein neues Objekt es heißt
  • s = ""; // Die Stringliteral wird im gemeinsamen Pool auf das gleiche Objekt beziehen

Sie können die vollständige Antwort auf den Link bebow finden: http://o7planning.org/web/fe/default/en/document/19529/string-stringbuffer-and-stringbuilder-tutorial

Beispiel:

public static void main(String[] args) { 
    String str1 = "apple"; 
    String str2 = "apple"; 

    if(str1 == str2) { 
     System.out.println("str1, str2: same object"); 
    } else { 
     System.out.println("str1, str2: different object"); 
    } 

    String str3 = new String("apple"); 
    String str4 = new String("apple"); 

    if(str3 == str4) { 
     System.out.println("str3, str4: same object"); 
    } else { 
     System.out.println("str3, str4: different object"); 
    }  
} 
3

Beide s = new String();s = ""; Ausdrücke geben ein String-Objekt, aber es gibt einen klaren Unterschied zwischen den beiden. s=new String() erstellt ein neues Objekt im Heap-Speicher. Wenn wir ein Objekt mit dem String-Literal s = ""; erstellen, kann es ein vorhandenes Objekt aus dem String-Pool (einen Cache von String-Objekten) zurückgeben, falls es bereits existiert.

Beispiel wird es klar machen:

String a= "banana"; 
String b= "banana"; 

Hier a und b auf das gleiche Objekt beziehen und daher ist a==b wahr

String a =new String("banana") 
String b= new String("banana") 

Hier a und b auf zwei verschiedene Objekte verweisen und daher ist a==b falsch

+4

Wie wird 'a == b 'im ersten Beispiel wahr? –

+2

Sie scheinen in dem Beispiel einen Fehler gemacht zu haben: 'a == b 'im ersten Beispiel wird nicht wahr zurückgegeben, da" Banane "_never_ gleich" orange "ist. Wenn beide "Banane" wären, dann wären sie gleich. – JonasCz

+0

ja danke für die Erhöhung .. – annu