1

重複の可能性:
整数ラッパー オブジェクトは、値 127 内でのみ同じインスタンスを共有しますか?

public class test
{
  public static void main(String args[])
  {
    Integer a1=127;
    Integer a2=127;
    System.out.println(a1==a2); //output: true

    Integer b1=128;
    Integer b2=128;
    System.out.println(b1==b2); //output: false

    Long c1=127L;
    Long c2=127L;
    System.out.println(c1==c2); //  output: true

    Long d1=128L;
    Long d2=128L;
    System.out.println(d1==d2); //output: false 
  }
}

出力:

true
false
true
false

負の値も使用できます。値を使用して出力を観察すると、動作が異なります。このような異なる結果の理由は何でしょうか?

任意の数値について、範囲は -127 から +127 である必要があり、その場合==は true または false になります。

(全員) 申し訳ありませんが、タイプミスでした。誤ってプリミティブと書きましたが、抽象的です。間違いをお詫びします。今修正...

4

4 に答える 4

9

整数はプリミティブではなく、オブジェクトです。使用した場合int、またはlong取得するだけですtrue

この結果が得られる理由は、整数が -128 ~ 127 の値に対してキャッシュされるため、Integer i = 127常に同じ参照が返されるためです。Integer j = 128必ずしもそうするわけではありません。equals次に、基になる が等しいかどうかをテストするために を使用する必要がありますint

これは、Java 言語仕様 #5.1.7で定義されています。

その範囲外の値の動作に注意してください [-128; 127] は定義されていません:

メモリ制限の少ない実装では、たとえば、すべての char 値と short 値、および -32K から +32K の範囲の int 値と long 値をキャッシュする場合があります。

于 2012-08-14T15:42:23.570 に答える
1

整数はプリミティブ型ではなく、ラッパー型です。参照: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2012-08-14T15:42:16.647 に答える
0

まず、整数はプリミティブではありません(intはプリミティブです)。しかし、なぜこれが起こっているのかを説明すると、Integer 実装で見つかった内部キャッシュが原因です。

 /**
 * Cache to support the object identity semantics of autoboxing for values between 
 * -128 and 127 (inclusive) as required by JLS.
 *
 * The cache is initialized on first usage. During VM initialization the
 * getAndRemoveCacheProperties method may be used to get and remove any system
 * properites that configure the cache size. At this time, the size of the
 * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
 */

したがって、本質的に、キャッシュされた 2 つの整数を比較すると、同じオブジェクトをそれ自体と比較しているため、== は true を返しますが、127 を超える整数または -127 未満の整数 (キャッシュされていない整数) を比較する場合は、2 つのオブジェクトを比較しています。異なる整数インスタンス。

equals または compareTo メソッドを使用すると、期待どおりの結果が得られます

于 2012-08-14T16:09:27.770 に答える
0

Integerオブジェクト (ラッパー クラス) であり、プリミティブ型ではありません

a1.intValue() == a2. intValue()代わりに (または)のように比較を行う方が良いですequals()

于 2012-08-14T15:42:11.647 に答える