2017-09-25 8 views
1

に新しいオブジェクトを作成しました。以下はコードです。実行したときに、新しく作成された文字列オブジェクトがStringプールにないことを推測できました。上記のコードリターン文字列に対してString.toUpperCase()は、ヒープまたは文字列プール

public class Question { 
    public static void main(String[] args) { 
     String s1="abc"; 
     System.out.println(s1.toUpperCase()==s1.toUpperCase()); 
    } 
} 

出力。 私は "=="とequals()の違いについて知っていますが、この質問では2つの作成された文字列が同じでない理由が不思議です。唯一の説明は、それらがStringプールで作成されず、2つの異なるオブジェクトであることです。

+2

[Javaの文字列を比較するにはどうすればいいですか](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – nullpointer

+1

文字列リテラルを作成すると、 Stringプールに移動します。それ以外の場合は、新しいオブジェクトが作成されます。 – Pramod

+1

'=='は2つの文字列を比較していないので、2つのオブジェクトが2つの文字列を比較しているので、2つのオブジェクトが違います。 Stringオブジェクトは不変なので、Stringプールに移動すると思います。 '不変vs可変オブジェクト '、'文字列プール対ヒープ ' –

答えて

1

Javaは自動的に文字列リテラルをインターナショナルにします。 answerにチェックしてください。toUpperCase()を使用すると、new String()を使用して文字列の新しいインスタンスが作成されるため、両方のオブジェクトが異なっています。

0

"=="演算子は2つのオブジェクト参照の値を比較して同じStringインスタンスを参照しているかどうかをチェックします。この場合、toUpperCase()はStringの新しいインスタンスを作成します。一方equals()方法で

にかかわらず2つのオブジェクト参照の内部文字列インスタンスが同じ文字列インスタンスかどうかを指す「値」と比較し、それは真を返します。

関連する問題