2016-07-21 2 views
0

次のコードは、私が「文字列は不変であり、リテラルがプールされている」trim()を実行.After、zはz="Hello World"と、なぜだろうという読みましたJava SEの文字列プール

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

を「false」を返す理由を私は理解できません出力はtrueではありませんか?

+0

これは(http://stackoverflow.com/questions/3689952/using-instead-of-equals-for-java-strings)あなたを助けることができます! – Imran

答えて

2

これは文字列が不変であるためです。そのため、trim()メソッドは、参照が異なるStringの新しいインスタンスを返します。あなたはソースコードを見て見ることができます。

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

あなたはオブジェクトとのポインタを比較していますが、これは異なっています。文字列の場合は、以下を使用してください。

x.equals(z) 
+0

なぜ違うのですか? "Hello World"は文字列プールにあり、xとzは同じ文字列を指しています – Gunel

+0

'x'と' y'は異なる 'String'オブジェクトであり、その内容は同じです。内容が等しいかどうかを比較するには、equals()を使用する必要があります。 –