0

Integer 型の 2 つの配列の値を比較したいと考えています。正確な値を比較すると間違った答えが得られ、Arrays.equals と比較すると正しい答えが得られます。

    Integer a[]=new Integer[2];
    Integer b[]=new Integer[2];
    a[0]=138;
    a[1]=0;
    b[0]=138;
    b[1]=0;
    boolean c;
    c=a[0]==b[0];//c is false
    c=Integer.valueOf(a[0])==Integer.valueOf(b[0]);//c is false
    c=Arrays.equals(a, b);//c is true
4

3 に答える 3

5

あなたが探しているのはintValueであり、そうではありませんInteger.valueOf(ただし、それらを混乱させる方法は簡単にわかります!):

c = a[0].intValue() == b[0].intValue();

Java には、プリミティブ型 ( intbytedoubleなど) と、オブジェクトが必要な状況に対応する参照型 (オブジェクト) があります。あなたのコードは、インスタンスa[0] = 138;内のプリミティブ値 138 を自動ボクシングしています。Integer

intValueインスタンスintに含まれるプリミティブを返します。インスタンスを取得するために使用されます( anまたは aから - あなたの場合、参照を自動アンボックス化することによって使用されます)。IntegerInteger.valueOfIntegerintStringvalueOf(int)Integer

これを行うこともできます:

c = (int)a[0] == (int)b[0];

...これにより、自動ボックス化解除がトリガーされます。

仕様のボックス化 (自動ボックス化とボックス化解除を含む)の詳細

于 2012-04-23T17:52:47.913 に答える
2

コードで暗黙的な型変換 (自動ボクシング) を行っています。

この線:

a[0]=138;

実際には次のように変換されます。

a[0] = Integer.valueOf(138);

整数のインスタンスを作成します。問題は、このメソッドが -128 から 127 までの整数をキャッシュし (整数キャッシュの大きさは? )、 127 より大きい値の新しいインスタンスを作成するため、 == 比較は false を返すことです。

/**
 * Returns an {@code Integer} instance representing the specified
 * {@code int} value.  If a new {@code Integer} instance is not
 * required, this method should generally be used in preference to
 * the constructor {@link #Integer(int)}, as this method is likely
 * to yield significantly better space and time performance by
 * caching frequently requested values.
 *
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 *
 * @param  i an {@code int} value.
 * @return an {@code Integer} instance representing {@code i}.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

a[0] の実際の型は整数なので、次のように記述できることに注意してください。

c=a[0].equals(b[0]);

これは true を返します。

于 2012-04-23T17:52:12.200 に答える
0

配列のため、内部の値が自動的にボックス化解除されるとは思いません。int[]の代わりに がある場合、これは機能する可能性がありますInteger[]

于 2012-04-23T17:53:34.837 に答える