我有两个关于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?
答案 0 :(得分:7)
关于问题1:数组从equals()
继承Object
的默认实现,仅当两个对象相同时才返回true
。您可以使用以下方法测试数组内容是否相等:
Arrays.equals(intArray1, intArray2);
关于问题2:除非对数组进行排序,否则二进制搜索会返回不可预测(通常是错误的)结果。它碰巧适用于特定的未排序数组是巧合。
答案 1 :(得分:5)
在未排序的数组上调用binarySearch时,通常会出现奇怪的结果。 它在javadoc:
中是明确的使用指针在指定的int数组中搜索指定的值 二分搜索算法。必须对数组进行排序(如排序方法, 在拨打此电话之前。如果未排序,则结果未定义。 如果数组包含具有指定值的多个元素, 无法保证找到哪一个。
equals
应该返回false
:你创建了两个不同的数组,equals
告诉你两个数组是不同的,尽管事件的内容相似。 Arrays.equals
实现了您打算使用的结构比较。
答案 2 :(得分:4)
Java中的数组对象不会覆盖equals()
方法。因此,您必须使用实用方法Arrays.equals()
:
Arrays.equals(intArray1, intArray2);
二进制搜索仅适用于sorted arrays:
Arrays.sort(intArray1);
答案 3 :(得分:2)
问题1:
在这种情况下,equals
比较对象(即指针)而不是它们的内容。您已创建了两个不同的对象,equals
按预期返回false
。
答案 4 :(得分:1)
问题#1: equals()
方法会比较对象的引用,而不是引用中的内容。因此,equals()方法对您的情况失败。比较的一种方法是使用Arrays.equals(int[] a, int[] a2)。根据Javadoc:
如果两个指定的Objects数组等于1,则返回true 另一个。如果两个数组都包含,则认为两个数组相等 相同数量的元素和所有相应的元素对 在两个数组中是相等的。考虑两个对象e1和e2 等于if(e1 == null?e2 == null:e1.equals(e2))。换句话说, 如果两个数组包含相同的元素,则它们是相等的 订购。此外,如果两个数组引用都相同,则认为它们相等 空。
问题#2 :来自binarySearch(int[] a, int key)的Javadoc:
使用指针在指定的int数组中搜索指定的值 二分搜索算法。必须对数组进行排序(如 在进行此调用之前,sort(int [])方法)。 如果没有排序, 结果未定义。如果数组包含多个元素 如果具有指定的值,则无法保证将使用哪一个 找到。强>
因此,您需要一个已排序且无重复的数组,以使此方法正常工作。
答案 5 :(得分:0)
- 首先,对sorted array
应用二进制搜索,这就是导致异常行为的原因。
- 其次,您应该使用方法Arrays.equals():
Arrays.equals(intArray1, intArray2);