Array.equal() 输出错误
Array.equal() giving wrong output
根据我的理解,下面的代码应该打印 true
,因为两个元素都是 equal
.
来自 java 文档 Array.get() 将 return:
Returns the value of the indexed component in the specified array
object. The value is automatically wrapped in an object if it has a
primitive type.
但是,当我 运行 下面的代码正在打印时
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));
}
}
我的问题是 类 实施 Number 是否或应该直接相互比较。
数组数据类型不匹配。一个是 int
,另一个是 byte
。由于它们作为对象传递给函数,因此它们最终将成为 Integer
和 Byte
。因此,为了正确比较它们,您需要将它们强制转换为同一类型。类似于:
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;
}
这真的与数组无关。您的比较相当于:
Object x = Integer.valueOf(3);
Object y = Byte.valueOf((byte) 3);
boolean equal = x.equals(y);
那永远不会 return true
。
即使您的原始数组是基本类型,Array.get
returns Object
,所以您得到的是盒装类型 - 并比较这些不同类型的值。
问题是 Array.get()
方法 return 是一个对象,因此对于 int
它将 return Integer
,对于 byte
,它将return Byte
。所以 .equals()
方法将 return false 因为它首先查看类型是否相同,然后比较值。
Array.get
调用 return Integer
和 Byte
对象实例。根据 Integer.equals
,它们不相等,因为 class 类型不同。
根据 documentation of Array.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
class的equals
方法首先检查它所比较的对象是否也是Integer
的实例,如果不是,则不需要进一步检查,它们不相等。
这就是您看到输出为 false 的原因,因为比较对象是 Integer
和 Byte
.
如果您查看 Array.get
的 JavaDoc,您会看到:
The value is automatically wrapped in an object if it has a primitive
type.
所以你的 byte
变成了 Byte
,你的 int
变成了 Integer
。
这意味着您调用的函数是 Integer.equals(Object)
这是这样实现的:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
您没有传递 Integer
,而是传递 Byte
,所以它 returns 为假。
根据我的理解,下面的代码应该打印 true
,因为两个元素都是 equal
.
来自 java 文档 Array.get() 将 return:
Returns the value of the indexed component in the specified array object. The value is automatically wrapped in an object if it has a primitive type.
但是,当我 运行 下面的代码正在打印时
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));
}
}
我的问题是 类 实施 Number 是否或应该直接相互比较。
数组数据类型不匹配。一个是 int
,另一个是 byte
。由于它们作为对象传递给函数,因此它们最终将成为 Integer
和 Byte
。因此,为了正确比较它们,您需要将它们强制转换为同一类型。类似于:
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;
}
这真的与数组无关。您的比较相当于:
Object x = Integer.valueOf(3);
Object y = Byte.valueOf((byte) 3);
boolean equal = x.equals(y);
那永远不会 return true
。
即使您的原始数组是基本类型,Array.get
returns Object
,所以您得到的是盒装类型 - 并比较这些不同类型的值。
问题是 Array.get()
方法 return 是一个对象,因此对于 int
它将 return Integer
,对于 byte
,它将return Byte
。所以 .equals()
方法将 return false 因为它首先查看类型是否相同,然后比较值。
Array.get
调用 return Integer
和 Byte
对象实例。根据 Integer.equals
,它们不相等,因为 class 类型不同。
根据 documentation of Array.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
class的equals
方法首先检查它所比较的对象是否也是Integer
的实例,如果不是,则不需要进一步检查,它们不相等。
这就是您看到输出为 false 的原因,因为比较对象是 Integer
和 Byte
.
如果您查看 Array.get
的 JavaDoc,您会看到:
The value is automatically wrapped in an object if it has a primitive type.
所以你的 byte
变成了 Byte
,你的 int
变成了 Integer
。
这意味着您调用的函数是 Integer.equals(Object)
这是这样实现的:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
您没有传递 Integer
,而是传递 Byte
,所以它 returns 为假。