2012-05-19 18 views
6

Ok, questa domanda è un'estensione di questa domandaNon dovrei fare `String s = new String (" una nuova stringa ");` in Java, anche con internamento automatico delle stringhe?

Java Strings: "String s = new String("silly");"

La domanda di cui sopra ha chiesto la stessa domanda come questo, ma ho un nuovo punto di dubitare.

Secondo Effective Java e le risposte di cui sopra domanda, dovremmo non fare String s = new String("a new string");, perché che creare l'oggetto inutile.

Non sono sicuro di questa conclusione, perché penso che Java stia facendo automatic string interning, che significa per una stringa, comunque c'è solo una copia di esso nella memoria.

Quindi vediamo String s = new String("a new string");.

è già una stringa che è stata creata nella memoria.

Quando faccio String s = new String("a new string");, quindi s è anche . Quindi, secondo automatic string interning, s deve essere indirizzato allo stesso indirizzo di memoria di "a new string", giusto?

Quindi come possiamo dire che creiamo oggetti non necessari?

+9

Là * è * solo una copia di String * a meno che non si esegua 'new String (...)' *. Non farlo a meno che non sia necessario. –

+0

+1 per domande interessanti, non ci ho mai pensato. Tuttavia, il più delle volte è possibile controllare questa roba esaminando le differenze (o la mancanza di differenze) nel bytecode tra le 2 versioni. –

+6

'intern'ing viene eseguito automaticamente solo su letterali' String'. – Jeffrey

risposta

16

String a = "foo"; // this string will be interned 
String b = "foo"; // interned to the same string as a 
boolean c = a == b; //this will be true 
String d = new String(a); // this creates a new non-interned String 
boolean e = a == d; // this will be false 
String f = "f"; 
String g = "oo"; 
String h = f + g; //this creates a new non-interned string 
boolean i = h == a // this will be false 
File fi = ...; 
BufferedReader br = ...; 
String j = br.readLine(); 
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned 
+0

Buona risposta. Molto semplice – keyser

0

utilizzando "=" invece di "= new String" è meglio dal momento che potrebbe risultare in una singola istanza, invece di più istanze.

2

Si consiglia di leggere ulteriori informazioni su Pool letterale stringa in JVM. Googling veloce mi ha indirizzato a questo articolo: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 che sembra abbastanza valido.

Potresti anche essere interessato al pool di interi letterali e ad altri pool letterali in Java.