2015-08-14 9 views
15
public static void main(String[] args) { 
    String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern() == str1); 
    String str2 = new StringBuffer("ja").append("va").toString(); 
    System.out.println(str2.intern() == str2); 
} 

Risultati:Perché i risultati di str == str.intern() per queste stringhe sono diversi?

true 
false 

primo stampe true, e le seconde stampe false. Perché i risultati sono diversi?

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern() – twentylemon

+0

sorry! Non capisco qual è il tuo punto? – side

+0

Perché no? Non c'è motivo per cui entrambi dovrebbero restituire "true", o perché entrambi dovrebbero restituire lo stesso risultato. – EJP

risposta

4

Poiché i compiti non riletti da intern pool e Java String (s) sono immutabili. Si consideri

String str1 = new StringBuilder("计算机").append("软件").toString(); 
String str1a = new String(str1); // <-- refers to a different String 
str1 = str1.intern(); 
str1a = str1a.intern(); 
System.out.println(str1a == str1); 
String str2 = new StringBuffer("ja").append("va").toString(); 
String str2a = new String(str2); // <-- refers to a different String 
str2 = str2.intern(); 
str2a = str2a.intern(); 
System.out.println(str2a == str2); 

L'uscita è (come ci si potrebbe aspettare)

true 
true 
+0

in modo che str1 e str1a abbiano lo stesso riferimento – side

+2

@side Ogni volta che due oggetti sono uguali a '==' hanno lo stesso riferimento. –

20

La differenza di comportamento è correlato alle differenze tra StringBuilder e StringBuffer.

Javadoc di String#intern() afferma che restituisce

Quando il metodo interno viene richiamato, se il pool contiene già una stringa uguale all'oggetto String determinato con il metodo equals(Object) , la stringa dalla piscina viene restituito. In caso contrario, questo oggetto String viene aggiunto al pool e un riferimento a questo oggetto String viene restituito.

Il String creato da

String str2 = new StringBuffer("ja").append("va").toString(); 

è un nuovo String che non appartiene alla piscina.

Per

str2.intern() == str2 

restituire false, la chiamata intern() deve aver restituito un valore di riferimento differente, cioè. il String"java" era già in piscina.

Nel primo confronto, il String "计算机 软件" non era nel pool di stringa prima alla chiamata a intern(). intern() ha quindi restituito lo stesso riferimento di quello memorizzato in str2. L'uguaglianza di riferimento str2 == str2 restituisce quindi true.

+1

Questo non spiega perché l'altro esempio si comporta in modo diverso sebbene –

+2

@JeroenVannevel La citazione _Altrimenti, questo oggetto String viene aggiunto al pool e viene restituito un riferimento a questo oggetto String._ non è abbastanza buono? –

+1

@SotiriosDelimanolis: anche l'altra stringa è internata, l'unica differenza è il stringbuilder/stringbuffer e il diverso set di caratteri –

1

Un sacco di risposte prima menzionate sul pool e spiegate in modo molto chiaro con i documenti di collegamento Oracle.

Vorrei solo indicare il modo in cui è possibile verificare quando si esegue il debug del codice.

String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern() == str1);//the str1.intern() returns the same memory address the str1 
    String str2 = new StringBuffer("ja").append("va").toString(); 
    System.out.println(str2.intern() == str2);//the str2.intern() does not return the same memory address the str2 

è possibile utilizzare qualsiasi IDE ed eseguire il debug di controllare l'indirizzo reale che lo str1 e str1.intern()/str2 e str2.intern().

+0

Pensa per il tuo consiglio! – side

+0

Hai provato ?! –

+0

Sì, eseguo il debug del mio programma, basta sapere! i risultati sono come ti aspettavi – side

Problemi correlati