2017-06-23 57 views
-3

据我的理解,下面的代码应该打印true,因为这两个元素都是equalArray.equal()给出错误的输出

从Java文档Array.get()将返回:

返回指定数组 对象中索引组件的值。如果该对象具有基本类型 ,则该值将自动包装在对象中。

然而,当我运行下面的代码是打印 false

public class Test1 { 

    static boolean equalTest(Object array1, Object array2) { 
     return Array.get(array1, 0).equals(Array.get(array2, 0)); 
    } 

    public static void main(String[] args) { 
     int[] a = new int[1]; 
     byte[] b = new byte[1]; 
     a[0] = 3; 
     b[0] = 3; 
     System.out.println(equalTest(a, b)); 
    } 
} 

我的问题是不执行数类是或者应该是直接的可比性彼此。

+0

它们不是同一类型? 'int!= byte' – TryingToImprove

+1

数据类型不匹配 – Akshay

+0

imho它应该打印为false,因为它们不是相同的类型。 –

回答

11

这与数组真的没有任何关系。您的比较等同于:

Object x = Integer.valueOf(3); 
Object y = Byte.valueOf((byte) 3); 
boolean equal = x.equals(y); 

那永远不会返回true

即使你的原始数组是原始类型,Array.get返回Object,所以你得到盒装类型 - 并比较这些不同类型的值。

+0

我很好奇,是否有清晰的价值? – JoshuaTree

+1

@JoshuaTree:“清晰”是什么意思?它完全有效 - 它是字节3(以字节形式)。 –

+0

@JonSkeet --- SIR非常感谢.... :)你的回答正好对目标进行了轰炸...... :) –

0

数组数据类型不匹配。一个是int,另一个是byte。由于它们以Objects的形式传递给函数,因此它们最终会变成IntegerByte。所以为了正确比较它们,你需要将它们转换为相同的类型。例如:

static boolean equalTest(Object array1, Object array2) { 
    int int1 = (int) Array.get(array1, 0); 
    int int2 = (int) Array.get(array2, 0); 
    return int1.equals(int2); 
    // OR return int1 == int2; 
} 
+1

嗯,它们不是'int'和'byte',因为'Array.get'返回'Object' - 它们会是包装类型。 (但是,是的,这是因为类型不一样)。 –

+0

Jon Skeet和我同意。那么我们都必须是对的。 :D @jonskeet – Vucko

+0

诚然,但是自动装箱应该照顾它。 – sorayadragon

0

的问题是,Array.get()方法返回一个对象,所以int它会返回Integer,并为byte,它将返回Byte。所以.equals()方法将返回false,因为它首先看到类型是否相同,然后比较值。

1

Array.get调用返回IntegerByte对象实例。根据Integer.equals,这些不相等,因为类的类型不同。

2

根据documentationArray.get(Object array,int index)方法,如果返回值具有基本类型,则会自动将其返回的值包装在对象中。所以,如果你加入下面几行:

System.out.println(Array.get(array1, 0).getClass()); 
System.out.println(Array.get(array2, 0).getClass()); 

你会看到输出

class java.lang.Integer 
class java.lang.Byte 

Integer类首先检查的equals方法,如果它被比较的对象也是一个Integer的实例,如果不是,则不需要进一步检查,它们不相等。 这就是你看到输出错误的原因,因为被比较的对象是相等的是IntegerByte

0

如果你看一下Java文档Array.get你会看到:

值会自动包装在一个对象,如果它有一个基本 类型。

所以你byte小号成为Byte S和您的int小号成为Integer秒。

这意味着你调用该函数是Integer.equals(Object)

实现此方法,像这样:

public boolean equals(Object obj) { 
    if (obj instanceof Integer) { 
     return value == ((Integer)obj).intValue(); 
    } 
    return false; 
} 

你不是传递一个Integer,你传递一个Byte所以这就是为什么它返回false。