Java 关于数组的几个问题

Java 关于数组的几个问题,java,arrays,Java,Arrays,我有两个关于Java数组的问题,希望你能抽出时间来帮助我 问题1: int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 }; int[] intArray2 = { 1, 4, 2, 5, 6, 7, 2 }; intArray1.equals(intArray2); 但是它返回false 问题2: 我运行以下代码: int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 }; //2 is duplicated Arrays.bin

我有两个关于Java数组的问题,希望你能抽出时间来帮助我


问题1:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  
int[] intArray2 = { 1, 4, 2, 5, 6, 7, 2 };

intArray1.equals(intArray2);
但是它返回false

问题2:

我运行以下代码:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  //2 is duplicated
Arrays.binarySearch(intArray1,2);
它返回-2

但当我消除重复时:

int[] intArray3 = { 1, 4, 2, 5, 6, 7}; // nothing is duplicated
Arrays.binarySearch(intArray1,2);
现在它返回2,这是正确的


我不知道数组中的二进制搜索如何处理导致-2的重复?

在未排序的数组上调用binarySearch时,通常会得到奇怪的结果。 这在以下文件中有明确规定:

使用 二进制搜索算法。必须对数组进行排序(如通过排序方法, 在拨打此电话之前。如果未排序,则结果未定义。 如果数组包含多个具有指定值的元素, 无法保证会找到哪一个

equals
按原样返回
false
:您创建了两个不同的数组,
equals
告诉您这两个数组不同,尽管它们的内容相似<代码>数组。equals实现您想要使用的结构比较。

问题1:


在这种情况下,
等于
比较对象(即指针)而不是其内容。您已经创建了两个不同的对象,并且
equals
按预期返回
false

关于问题1:数组从
对象继承
equals()
的默认实现,仅当两个对象相同时才返回
true
。您可以使用以下方法测试数组的内容是否相等:

Arrays.equals(intArray1, intArray2);

关于问题2:除非对数组进行排序,否则二进制搜索将返回不可预测(通常是错误的)结果。它恰好在特定的未排序数组上工作是一种巧合。

Java中的数组对象不会重写
equals()
方法。因此,您必须使用实用方法:

二进制搜索仅适用于:

问题1:方法比较对象的引用,而不是引用中的内容。因此,equals()方法在您的案例中失败。比较的一种方法是使用。根据Javadoc:

如果指定的两个对象数组等于一,则返回true 另一个如果两个数组都包含 相同数量的元素,以及所有对应的元素对 在这两个数组中,数组是相等的。考虑两个对象e1和e2 如果(e1==null?e2==null:e1.equals(e2))则相等。换句话说 如果两个数组在同一个数组中包含相同的元素,则它们是相等的 秩序。此外,如果两个数组引用都相同,则认为它们相等 空

问题#2:来自Javadoc的:

使用 二进制搜索算法。必须对数组进行排序(按 在进行此调用之前对(int[])方法进行排序如果未排序, 结果未定义。如果数组包含多个元素 对于指定的值,无法保证将使用哪一个 找到。


因此,您需要一个已排序且没有重复项的数组,此方法才能正常工作。

-首先,二进制搜索将应用于已排序数组,这就是异常行为的原因

-其次,应该使用方法
Arrays.equals():


Arrays.equals(intArray1,intArray2)

二进制搜索仅适用于排序数组!必须对数组进行排序才能使其正常工作。见文档:谢谢你的回复,在我添加了array.sort(intArray1)之后;和数组。排序(intArray2);二进制搜索确实有效!但是equals仍然是假的,对我来说,它看起来像[家庭作业]。实际上,在这种情况下,相关的方法是
数组。equals(int[]a,int[]a2)
@TedHopp:我从Javadoc复制粘贴了错误的签名。谢谢你指出这一点!编辑了我的帖子:)不完全正确,
的默认实现等于来自
对象的
比较指针。其他类可以克服这一点。@weston-当然我的意思是“在这种情况下,
等于
…”。编辑以使其清晰。
Arrays.equals(intArray1, intArray2);
Arrays.sort(intArray1);