2016-07-21 16 views
0

Ich kann nicht verstehen, warum Code unten gibt „false“Java SE String Pool

String x="Hello World"; 
String z=" Hello World".trim(); 
System.out.println(x==z); //false 

ich gelesen habe, dass „Strings sind unveränderlich und Literale werden gepoolt“ .Nach trim() ausgeführt wird, wird z z="Hello World" und dann sein, warum Ausgabe ist nicht true?

+0

Dies (http://stackoverflow.com/questions/3689952/using-instead-of-equals-for-java-strings) kann Ihnen helfen! – Imran

Antwort

2

Es ist, weil Strings unveränderlich sind! Aus diesem Grund gibt die Methode trim() eine neue Instanz von String zurück, die eine andere Referenz hat. Sie können es sehen, indem Sie den Quellcode ansehen.

public String trim() { 
    int len = value.length; 
    int st = 0; 
    char[] val = value; 

    while ((st < len) && (val[st] <= ' ')) { 
     st++; 
    } 
    while ((st < len) && (val[len - 1] <= ' ')) { 
     len--; 
    } 
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this; 
} 

public String substring(int beginIndex, int endIndex) { 
    if (beginIndex < 0) { 
     throw new StringIndexOutOfBoundsException(beginIndex); 
    } 
    if (endIndex > value.length) { 
     throw new StringIndexOutOfBoundsException(endIndex); 
    } 
    int subLen = endIndex - beginIndex; 
    if (subLen < 0) { 
     throw new StringIndexOutOfBoundsException(subLen); 
    } 
    return ((beginIndex == 0) && (endIndex == value.length)) ? this 
      : new String(value, beginIndex, subLen); // new instance! 
} 
2

Sie vergleichen die Zeiger mit den Objekten, die unterschiedlich sein werden. Für Zeichenfolgen sollten Sie verwenden:

x.equals(z) 
+0

Warum anders? "Hallo Welt" ist in String Pool und X und Z zeigen auf die gleiche Zeichenfolge – Gunel

+0

'x' und' y' sind verschiedene 'String' Objekte, es ist nur der Inhalt, der derselbe ist. Um den Inhalt für die Gleichheit zu vergleichen, müssen Sie 'equals()' verwenden. –