0

我想比较两个整数类型数组的值。当我比较它们的确切值时,我得到了错误的答案,而当我将它们与 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 回答