Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较已存储为对象的数组_Java_Arrays_Object - Fatal编程技术网

Java 比较已存储为对象的数组

Java 比较已存储为对象的数组,java,arrays,object,Java,Arrays,Object,ObjectHolder类型的对象中的多用途字段包含对象objobj可能存储一个已包装的基元或基元数组。如果两个对象是数组,我们如何比较它们?一个简化的例子: import java.util.Arrays; public class ObjectHolder { public Object obj; public static void main(String[] args) { ObjectHolder oh1 = new ObjectHolder()

ObjectHolder类型的对象中的多用途字段包含对象objobj可能存储一个已包装的基元或基元数组。如果两个对象是数组,我们如何比较它们?一个简化的例子:

import java.util.Arrays;

public class ObjectHolder {

    public Object obj;

    public static void main(String[] args) {

        ObjectHolder oh1 = new ObjectHolder();
        oh1.obj = new int[]{ 3, 4, 5 };

        ObjectHolder oh2 = new ObjectHolder();
        oh2.obj = new int[]{ 3, 4, 5 };

        if (oh1.obj.getClass().isArray() && oh2.obj.getClass().isArray()) {
            System.out.println("We know both objects are arrays.");
            // System.out.println(Arrays.equals(oh1.obj, oh2.obj));
        }   
    }   

}   
注释掉的行导致编译中断


注意-数组可以是任何基元类型(或字符串),因此简单地将其强制转换为int[]不是一个方便的通用解决方案。

接下来,通过调用验证数组是否具有相同的组件类型,然后调用适当的重载(共有9个)

已更新

当然,只要打电话就会容易得多,因为它已经具备了这样做的所有逻辑

if (Arrays.deepEquals(new Object[] { oh1.obj }, new Object[] { oh2.obj })) {
    // They are equal, though they may not be arrays
}
引用javadoc,其中
e1=oh1.obj
e2=oh2.obj

  • e1
    e2
    都是对象引用类型的数组和
    数组。deepEquals(e1,e2)
    将返回true
  • e1
    e2
    是相同基元类型的数组,而
    数组的适当重载。equals(e1,e2)
    将返回true
  • e1==e2
  • e1.equals(e2)
    将返回true

在这种情况下,Java反射将完成这项工作(来自问题的想法):


这是哪个java版本的可能副本?我好像找不到it@Tibrogargan-我不这么认为,他说的是ObjectHolder@ItamarGreen是的,他是:“如果两个对象是数组,我们如何比较它们?”。物体持有者那块他已经got@Tibrogargan您没有注意到数组可能不是
int[]
对象。它们可以是
float[]
boolean[]
String[]
Object[]
Long[]
,或者任何你能想象到的东西。阅读问题的最后一句话:注意-数组可以是任何基元类型(或字符串),因此简单地将其转换为int[]并不是一个方便的通用解决方案。如果对象不是数组,这似乎[对于某些对象]也会起作用。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class ObjectHolder {
    public Object obj;

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

        ObjectHolder oh1 = new ObjectHolder();
        oh1.obj = new int[] { 3, 4, 5 };

        ObjectHolder oh2 = new ObjectHolder();
        oh2.obj = new int[] { 3, 4, 6 };

        if (oh1.obj.getClass().isArray() && oh1.obj.getClass().equals(oh2.obj.getClass())) {
            Class<?> c = oh1.obj.getClass();

            if (!c.getComponentType().isPrimitive()) {
                c = Object[].class;
            }

            Method m = Arrays.class.getMethod("deepEquals", c, c);
            System.out.println((Boolean) m.invoke(null, oh1.obj, oh2.obj));
        }
    }
}
if(oh1.obj.getClass().isArray() && oh1.obj.getClass().equals(oh2.obj.getClass())) {
    System.out.println(Arrays.deepEquals(new Object[] { oh1.obj }, new Object[] { oh2.obj }))
}