关于数组的一些问题

时间:2012-09-30 07:43:58

标签: 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.binarySearch(intArray1,2);

并返回-2。

但是当我删除重复时:

int[] intArray3 = { 1, 4, 2, 5, 6, 7}; // nothing is duplicated
Arrays.binarySearch(intArray1,2);

现在它返回2,这是正确的。

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

6 个答案:

答案 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);