如何在Java中覆盖数组的等于?

我希望覆盖int []数组的equals。 这样以下就是真的

int[] a = {1,2,3}; int[] b = {1,2,3}; System.out.println(a.equals(b)); 

有没有办法做到这一点?

覆盖int[]equals方法既不可能也不必要。 您希望的function可以通过使用Arrays.equals(int [],int [])来实现 。

 int[] a = {1,2,3}; int[] b = {1,2,3}; System.out.println(Arrays.equals(a, b)); 

数组是Java的低级构造,因此您无法创建子类,因此您无法覆盖方法。 但是您可以使用java.util.List而不是数组。 现代JRE显示了arrays和列表的相同性能。

您不能直接在数组上重写equals – 数组是Java中的基本结构,您不能覆盖对其起作用的方法或运算符。

您应该考虑使用ArrayList而不是数组 – ArrayLists提供了一个可以正常工作的equals()实现(以及数组没有的许多其他有用function,例如向列表中添加新元素的function)等等。)

这里的其他答案是正确的,你应该只使用Arrays.equals()或切换到使用List而不是int[]

但是,您想要做的几乎是使用reflection和javassist.util.proxy.ProxyFactory 。 这里有一些示例代码可以做或多或少的技巧:

 public static void main(String[] args) throws Exception { int[] test = {0, 1, 2, 3}; int[] empty1 = {}; int[] empty2 = {}; Class clss = int[].class; ProxyFactory factory = new ProxyFactory(); factory.setSuperclass(clss); factory.setFilter(new MethodFilter() { public boolean isHandled(Method m) { // ignore finalize() return !m.getName().equals("finalize"); } }); factory.setHandler(new IntArrayEqualsHandler()); Class newArrayClass = factory.createClass(); int[] specialArray = (int[])newArrayClass.newInstance(); System.out.println(empty1.equals(empty2)); System.out.println(specialArray.equals(empty1)); System.out.println(specialArray.equals(empty2)); System.out.println(specialArray.equals(test)); } private static class IntArrayEqualsHandler implements MethodHandler { @Override public Object invoke(Object thisObj, Method method, Method original, Object[] params) throws Throwable { if (method.getName().equals("equals")) { int[] left = (int[])thisObj; int[] right = (int[])params[0]; return Arrays.equals(left, right); } return original.invoke(thisObj, params); } } 

不幸的是,这不起作用,因为int[].class在语言中被声明为final ,所以即使使用reflection它也无法扩展。 至少据我所知。 您可以使用一些技巧从字段中删除“最终”修饰符 ,但似乎没有可用于从整个类中删除final修饰符的等效黑客。

如果有这样的事情,你可以使用上面的代码或类似的东西在运行时生成int[]的自定义子类,实现你想要的equals()行为。

真的,虽然这比它的价值更麻烦,特别是当你开始研究如何在项目的其余部分实际使用自定义子类时。 因此,只要使用Arrays.equals()List所有事情都会考虑更好。