次のコードは、私が「文字列は不変であり、リテラルがプールされている」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
ではありませんか?
次のコードは、私が「文字列は不変であり、リテラルがプールされている」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
ではありませんか?
これは文字列が不変であるためです。そのため、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!
}
あなたはオブジェクトとのポインタを比較していますが、これは異なっています。文字列の場合は、以下を使用してください。
x.equals(z)
なぜ違うのですか? "Hello World"は文字列プールにあり、xとzは同じ文字列を指しています – Gunel
'x'と' y'は異なる 'String'オブジェクトであり、その内容は同じです。内容が等しいかどうかを比較するには、equals()を使用する必要があります。 –
これは(http://stackoverflow.com/questions/3689952/using-instead-of-equals-for-java-strings)あなたを助けることができます! – Imran