Java 数组列表上的等于()

Java 数组列表上的等于(),java,Java,我并不是想把数组放到列表中,我只是想知道会发生什么 String[] array11 = {"Hello", "world"}; String[] array12 = {"foo", "bar"}; String[] array21 = new String[array11.length]; String[] array22 = new String[array12.length]; System.arraycopy(array11, 0, array21, 0, array11.length

我并不是想把数组放到列表中,我只是想知道会发生什么

String[] array11 = {"Hello", "world"};
String[] array12 = {"foo", "bar"};

String[] array21 = new String[array11.length];
String[] array22 = new String[array12.length];
System.arraycopy(array11, 0, array21, 0, array11.length);
System.arraycopy(array12, 0, array22, 0, array12.length);

List<String[]> list1 = Arrays.asList(array11, array12);
List<String[]> list2 = Arrays.asList(array21, array22);

System.out.println(list1.equals(list2)); // false
凭直觉,这两个列表当然是相等的。有没有办法让上面的代码打印为真?除了实现我自己的列表和覆盖等于以考虑数组之外。

您可以使用AssertArrayQualsObject[]预期值,Object[]实际值。它是org.junit.Assert类的一部分。

在java中。equals测试两个对象是否是完全相同的对象,即在内存中的确切位置。因为您做了一个拷贝,所以就Java而言,这是两个唯一的数组。将元素添加到一个元素不会将其添加到另一个元素。现在有两个列表,每个列表中有两个数组

因此,您无法覆盖。等于使此特定场景打印为真。您可以在该链接中使用Listlike更多信息:

List<List<String>> list1 = new ArrayList() {{
    add(new ArrayList(Arrays.asList("Hello", "world")));
    add(new ArrayList(Arrays.asList("foo", "bar")));
}};
 List<List<String>> list2 = new ArrayList()  {{
    add(new ArrayList(Arrays.asList("Hello", "world")));
    add(new ArrayList(Arrays.asList("foo", "bar")));
}};

数组不重写equals方法并使用一个表单对象类,该类基本上调用==所以它检查引用,这意味着数组只与自身相等,而不测试数组的内容。因此,我们有一些实用方法,如Arrays.equasarr1、arr2。为了避免这种问题,通常使用列表而不是数组,我们不应该混合使用它们,因为数组不能很好地处理泛型类型。您可以使用类似List list1=List.ofArrays.asListarray1、Arrays.asListarray2的内容。因此基本上,答案是不要混合使用数组和列表。这很公平。数组不重写equals有什么技术原因吗?@felixklink,因为它们最初没有重写equals,而更改它会破坏向后兼容性。不能使用列表,因为必须使用equals比较元素;但是您可以比较两个列表,因此将Arrays.asListArrays.asListarray11、Arrays.asListarray12与构造类似的列表进行比较。我要比较的是列表,而不是其中的数组。它们被隐式地比较,显然,它们被检查为同一性而不是平等性。这就是我的问题。@Felixklink这违反了的约定,它要求在成对元素之间使用Object.equals。内存中的确切位置是吗?