2013-03-15 10 views
5

tutto, ho affrontato un problema quando un scrivere il codice qui sottouna confusione su Java String piscina letterale e la concatenazione di stringa

String hello = "Hello"; 
String str5 = "Hel" + "lo"; 
String str8 = "Hel"; 
String str9 = "lo"; 
String str10 = str8 + str9; 
System.out.println("str10==hello?" + (str10 == hello)); 
System.out.println("str5==hello?" + (str5 == hello)); 
System.out.println("str10==str5?" + (str10 == str5)); 

poi ho eseguito il mio codice e la stampa console questo

str10 == hello ? false 
str5 == hello ? true 
str10 == str5 ? false 

questo mi ha confuso molto perchè la seconda stampa TRUE ma la prima stampa FALSE ?? nella mia comprensione del pool letterale String, quando una stringa definita e JVM controllerà se il pool contiene quella stringa, in caso contrario, inserire la stringa nel pool.
nel mio codice, variabile ciao esiste in pool di stringa," Helo "e" lo "anche in piscina, la mia domanda è

  1. se il risultato della concatenazione di" Helo "e" lo "esiste nel pool.
  2. Qual è la differenza tra la definizione di str5 e str10s 'e perché non sono "=="? ? Lo STR5 e str10 si riferiscono alla differente "Ciao” che nel pool di stringa ('==' sembra significare il riferimento è lo stesso oggetto)

la mia versione del JDK: 1.6.0_29
mia IDE: IntelliJ IDEA 11.2

chiunque può farlo notare grazie mille

risposta

7

si comporta come dovrebbe si destinatari in due sezioni della JLS

JLS #3.10.5:?..

stringhe che sono i valori delle espressioni costanti (§15.28) - sono "internati" in modo da condividere istanze univoche, utilizzando il metodo String.intern.

JLS #15.28 elenca ciò che viene considerato come espressione costante. In particolare, i valori letterali delle stringhe sono espressioni costanti ("Hel" e "lo"), ma per una variabile che deve essere considerata una costante, deve essere definitiva.

Nel tuo caso, se si cambia un po 'il codice per rendere str8 e str9 costante, si ottengono true tre volte:

final String str8 = "Hel"; 
final String str9 = "lo"; 
+0

grazie!questo mi aiuta molto – fuye

-1

Se u confrontare due stringhe utilizzano string.equals non string1 == string2

provarlo :

System.out.println("str10==hello?" + (str10.equals(hello)); 
+0

sì, come possiamo vedere nel codice sorgente di String equals, prima controlla se (this == anObject) {return true;}, quindi giudica se è l'istanza della String, se lo è, confronta i contenuti di due oggetti stringa. – fuye

0

Il codice ha i seguenti punti da considerare:

String hello = "Hello"; 

Qui "Ciao" è un letterale assegnato per fare riferimento ciao così il letterale ha il suo codice hash

String str5 = "Hel" + "lo"; 

Qui "Hel" + "lo" sono 2 letterali combinati e assegnati al riferimento ciao così il nuovo letterale è stessa del primo e quindi stesso hashcode

String str8 = "Hel"; 
String str9 = "lo"; 

Qui str8 + Str9 sono 2 riferimenti che combinano e punto ad un nuovo riferimento ciao così il nuovo letterale ha il proprio hashcode

String str10 = str8 + str9; 
System.out.println("str10==hello?" + (str10 == hello)); 
System.out.println("str5==hello?" + (str5 == hello)); 
System.out.println("str10==str5?" + (str10 == str5)); 

quando si utilizza == corrisponde per codice hash e valore. quindi la mancata corrispondenza.

tenta di utilizzare

string_1.equals (STRING_2)

invece di

STRING_1 == stringa_2

e si otterrà il valore corrispondente solo . in tal modo tutto vero

prega di fare riferimento alla risposta qui sotto anche (da What is the difference between == vs equals() in Java?):

equals() metodo confronta il "valore" dentro istanze String (nel mucchio), indipendentemente se i due (2) i riferimenti agli oggetti si riferiscono alla stessa istanza di Stringa o meno. Se due (2) riferimenti a oggetti di tipo String si riferiscono alla stessa istanza di stringa, allora ottimo! Se i due (2) riferimenti agli oggetti si riferiscono a due (2) diverse istanze di String, non fa differenza. È il "valore" (ovvero il contenuto dell'array di caratteri) all'interno di ciascuna istanza di String che viene confrontata.

D'altra parte, l'operatore "==" confronta il valore di due riferimenti a oggetti per vedere se si riferiscono alla stessa istanza di String. Se il valore di entrambi i riferimenti oggetto "fa riferimento" alla stessa istanza String, il risultato dell'espressione booleana sarebbe "vero" .. duh. Se, d'altra parte, il valore di entrambi i riferimenti oggetto "fa riferimento a" diverse istanze String (anche se entrambe le istanze String hanno "valori" identici, cioè il contenuto delle matrici di caratteri di ogni istanza di String sono uguali) il risultato dell'espressione booleana sarebbe "falso".

+1

mi dispiace non capisco che "usa == corrisponde per codice hash e valore",
stampo ogni hashcode di str5, str8, str9, str10 è quello ciao.hash-> 69609650; str8.hash-> 72431; str9.hash-> 3459; str10.hash-> 69609650; str5.hash-> 69.609.650; come possiamo vedere, l'hashcode di str5, str10 esattamente lo stesso codice, ma str5 == str10 restituisce false; – fuye

+0

si prega di controllare la risposta modificata –

+0

grazie per aver dedicato del tempo a scrivere questo.questa figura la mia confusione tra "==" e "uguale" .molto grato – fuye

0
String hello = "Hello";  // at compile time string is known so in String Constant Pool 

String str5 = "Hel" + "lo"; // at compile time string is known so in String Constant Pool same object as in variable hello 

String str8 = "Hel";   // at compile time string is known so in String Constant Pool 

String str9 = "lo";   // at compile time string is known so in String Constant Pool 

String str10 = str8 + str9; // at runtime don't know values of str8 and str9 so in String Constant Pool new object different from variable hello 

str10 == hello ? false  // as str10 has new object and not the same as in hello 

str5 == hello ? true   // both were created at compile time so compiler know what's the result in str5 and referenced the same object to str5 as in hello 

str10 == str5 ? false   // str10 is a different object, hello and str5 are referenced same object as created at compile time. 
Problemi correlati