Array.equal()给出错误的输出

时间:2017-06-23 13:58:19

标签: java arrays reflection equals

据我了解,以下代码应打印equal,因为这两个元素都是false

来自java docs,Array.get()将返回:

  

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

但是,当我运行以下代码时,它正在打印   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)); } }

B = regexp(a, ':', 'split');
C = vertcat(B{:});
D = str2double(C);  %D = cellfun(@str2num, C); also works but slower

我的问题是,实现号码的类不是或者应该直接相互比较。

6 个答案:

答案 0 :(得分:11)

这与数组无关。您的比较等同于:

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

永远不会返回true

即使您的原始数组属于基本类型,Array.get也会返回Object,因此您可以获取已装箱的类型 - 并比较这些不同类型的值。

答案 1 :(得分:2)

根据Array.get(Object array,int index)方法的documentation,如果对象具有基本类型,则返回的值将自动包装在对象中。因此,如果添加以下行:

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

您将看到输出

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

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

答案 2 :(得分:1)

Array.get次调用返回IntegerByte个对象实例。根据{{​​1}},这些不相等,因为类类型不同。

答案 3 :(得分:0)

阵列数据类型不匹配。一个是int,另一个是byte。由于它们作为对象传递给函数,因此它们最终会成为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;
}

答案 4 :(得分:0)

问题是val decodeMessage = udf { bytes:Array[Byte] => val dr = deser.deserialize("topic.name", bytes).asInstanceOf[DeviceRead] // do additional transformation here so you use a custom streaming-specific class // Here I'm using a simple tuple to hold what might be relevant // You could create a case class instead to have proper names (dr.id, dr.value) } 方法返回一个对象,因此对于Array.get()它将返回int,对于Integer,它将返回{{} 1}}。因此,byte方法将返回false,因为它首先查看类型是否相同,然后比较值。

答案 5 :(得分:0)

如果您查看Array.get的JavaDoc,您会看到:

  

如果对象具有基元,则会自动将其包装在对象中   类型。

因此,byte成为Byteint成为Integer

这意味着您正在调用的功能是Integer.equals(Object)

这是这样实现的:

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

你没有传递Integer,你传递的是Byte,这就是它返回false的原因。