ObjectHolder 类型的对象中的多用途字段包含对象 obj 。 obj 可能存储包装的基元或基元数组。如果它们是数组,我们如何比较两个 obj ?一个简化的例子:
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));
}
}
}
注释掉的行导致编译中断。
注意 - 数组可以是任何原始类型(或String),因此只需将其强制转换为 int [] 就不是一种方便的通用解决方案。
答案 0 :(得分:2)
接下来,通过调用getComponentType()
验证数组是否具有相同的组件类型,然后调用Arrays.equals()
的适当重载(其中有9个)。
<强>已更新强>
当然,调用Arrays.deepEquals(Object[] a1, Object[] a2)
要容易得多,因为它已经具备了这样做的所有逻辑。
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
都是对象引用类型的数组,Arrays.deepEquals(e1, e2)
将返回truee1
和e2
是相同基元类型的数组,Arrays.equals(e1, e2)
的适当重载将返回true。e1 == e2
e1.equals(e2)
将返回true。
答案 1 :(得分:2)
在这种情况下,Java Reflections将完成这项工作(来自问题Java Array Comparison的想法):
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));
}
}
}
我认为@Andreas在他编辑的答案中指出的方式可能是比使用Java思考更短,更好,更清晰的解决方案:
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 }))
}