在 Java 中工作,假设我有两个对象,感谢 obj.getClass().isArray()
,我知道它们都是数组。让我们进一步说,我想将这两个数组相互比较——可能通过使用 Arrays.equals
。有没有一种优雅的方法可以做到这一点,而无需求助于一个庞大的详尽 if/else 树来确定需要使用哪种风格的 Arrays.equals
?我正在寻找比这更不碍眼的东西:
if (obj1 instanceof byte[] && obj2 instanceof byte[]) {
return Arrays.equals((byte[])obj1, (byte[])obj2);
}
else if (obj1 instanceof boolean[] && obj2 instanceof boolean[]) {
...
最佳答案
你可以使用反射。
public static boolean arrayEquals(Object arr1, Object arr2) throws Exception {
Class<?> c = arr1.getClass();
if (!c.getComponentType().isPrimitive()) {
c = Object[].class;
}
Method m = Arrays.class.getMethod("equals", c, c);
return (Boolean) m.invoke(null, arr1, arr2);
}
反射仅用于在运行时找到正确的方法,而不是您希望避免的麻烦;实际Arrays.equals
方法应该运行得非常快。
显然,生产版本需要更强大的异常处理。您可能还想使用 deepEquals(Object[], Object[])
而不是 equals(Object[], Object[])
对于非原始数组。
关于Java数组比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493711/