2
main(){

Integer i1 = 500;

Integer i2 = 500;

System.out.println(i1 == i2);  // O/P is "**false**"

String s1 = "Hello";

String s2 = "Hello";

System.out.println(s1 == s2);  // O/P is "**true**"

} // End of main.

出力が異なる理由がわかりません。私が知っている限り、s1、s2はヒープ上の同じオブジェクトを指します。したがって、それらの参照アドレスは同じです。同様に、整数も同じだと思います。そうではありません。なぜ違うのですか?

4

6 に答える 6

8

すでにここで回答されています:java:整数はvs.==に等しい

この投稿からの抜粋:JVMは整数値をキャッシュしています。==は、-128〜127の数値に対してのみ機能します。したがって、この例では500では機能しません。

于 2012-08-08T12:48:14.523 に答える
0

この質問の答えはそれを説明するのに役立つはずです: Javaで2つの整数を適切に比較する方法は?

ほとんどあなたはあなた自身の質問に答えました。「==」は、文字列内の参照ポイントを比較するだけでなく、整数でも同じことを行うようです。

于 2012-08-08T12:48:09.443 に答える
0

使用string1.equals(string2);//文字列値に使用

string1 == string2;//整数値に使用する代わりに

お役に立てれば。

于 2012-08-08T12:46:44.373 に答える
0

「Hello」を指定した方法では、ヒープの割り当ては行われません。代わりに、静的コンパイル時定数としての「Hello」は、実行可能ファイルの特定のセクションにアウトソーシングされ、参照されます。したがって、両方の参照は同じアドレスを指します。

于 2012-08-08T12:48:49.470 に答える
0

したがって、Java文字列プールがあり、ここでs1とs2は実際には同じリンクです。整数の場合、プールもありますが、整数-127から128までのみ存在します。

だからあなたが持っているなら

Integer i1 = 100;

Integer i2 = 100;

次に、i1==i2が真になります

于 2012-08-08T12:49:19.703 に答える
0

"=="は、常に値のメモリ位置またはオブジェクト参照を比較します。equalsメソッドは常に値を比較しますが、equalsは間接的に「==」演算子を使用して値を比較します。Integerは、整数キャッシュを使用して-128〜 + 127の値を格納します。==演算子を使用して-128〜127の値をチェックすると、trueが返されます。これらの値以外の場合はfalseを返します。

文字列では、文字列がこのように初期化されている場合

    String s1="abc"
    String s2="abc"

文字列s1とs2は、メモリまたは文字列プール内の同じ場所を指しています。

文字列がこのように初期化されている場合

    String s1=new String("abc"); 
    String s2=new String("abc");

文字列s1は、文字列 "abc"が含まれる新しい場所を指しています。文字列s2は、文字列 "abc"が含まれる新しい場所を指していますが、s1の場所はs2の場所とは異なります。その場合、equalsメソッドは文字列の比較に役立ちます。

追加情報については、リンクを参照して ください

于 2016-07-28T06:30:40.453 に答える