あなたが言ったように、c1とc2は同じオブジェクトをヒープで共有しているため、比較は真です。これはJavaのキャッシュメカニズムです。すべての文字、-127〜127の範囲の値を持つ整数がキャッシュされます。 Javaは新しい値を作成する代わりに、キャッシュされた値を取得します。それで、両方のオブジェクトが同じ参照を共有しているのです。ここで
Character c1 = 'a';
Character c2 = 'a';
Character c3 = new Character('a'); // force Java creates new object in heap
System.out.println(c1 == c2); -> true
System.out.println(c1 == c3); -> false
同じ理由で、別の例である:
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i3 == i4); // false, out of cache range
あなたは、文字列のために、異なるメカニズムに別の例を満たしています:
String s1 = "stack";
String s2 = "stack";
String s3 = new String("stack");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
すべてのJava文字列の作成時になります割り当てられ、String Pool
に格納されます。新しい文字列を作成すると(s2の場合)、JavaはString pool
を検索します。この文字列がすでにどこかに割り当てられているかどうかを調べます。 s3の場合、私たちはJavaに「こんにちは、Java、常に新しいものを作成してください」と言っています。
概要2つのオブジェクトを比較する場合、compareTo
メソッドを使用すると、2つのプリミティブを比較すると、==
演算子を使用できます。 (古いJavaクラスを思い出させる)。
希望我々は、Javaのランタイム定数プールには、以下のリテラルを格納していることを知っている、このヘルプ:)
出典
2016-05-08 02:55:10
hqt
嫌いな人:私が間違って言ったことを親切に説明できますか? –
'char'リテラルは、各行の' Character'クラスインスタンスに別々に自動ボクシングされます。 'Character'インスタンスが不変であると見ると、それらは使用時に影響を受けて「同じ」ですが、メモリ内の異なる場所を占有します。 – Ownaginatious
使用されているJVM実装が、数えやすいプリミティブ(つまり、charとboolean)のボクシングされたインスタンスをキャッシュするほど洗練されているとは限りません。あなたが言っていることは必ずしも間違っているとは限らず、必ずしも必ずしも正しいとは限りません。それにかかわらず、あなたはその質問に答えていません。あなたの例では 'Character'を' Long'に変更してください。あなたが言ったことはもはや真実ではないでしょう。私はあなたを落胆させた人ではありません;) – Ownaginatious