`
wang吖
  • 浏览: 240689 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中 Arrays.binarySearch() 的陷阱

 
阅读更多

       我们在使用  Arrays.binarySearch() 的系列方法时要格外小心,对于sun提供的二分查找的方法本身并没有BUG,但是程序员在使用该方法的时候确容易忽略使用该方法的前提条件,即使程序员忽略了使用的前提sun也未给出任何的提醒和警告,程序都能正常编译,但是往往运行却达不到你预想的结果,废话少说直接上代码(大家可以先猜猜程序的输出结果):

 

Coding:

import java.util.Arrays;

public class Demo {

	public static void main(String[] args) {
		int[] a = new int[] { 128, 129 };
		int pos = Arrays.binarySearch(a, 128);
		System.out.println("Pos=" + pos);
		pos = Arrays.binarySearch(a, 129);
		System.out.println("Pos=" + pos);

		int[] b = new int[] { 129, 128 };
		pos = Arrays.binarySearch(b, 128);
		System.out.println("Pos=" + pos);
		pos = Arrays.binarySearch(b, 129);
		System.out.println("Pos=" + pos);
	}
	
}

 

输出结果:

Pos=0
Pos=1
Pos=-1
Pos=0

 

上面的输出结果是否让你觉得很意外?

 

其实问题出在对二分查找的前提忽略上(数组必须有序),其实说sun土也真土,说自己土自己也真土 ,不过我要是sun我就尽量做到不让程序员土,让程序员土了那就是系统的灾难,看似很简单的一个问题如果程序员在使用忽略了数组有序的问题的确容易出现问题而且还半天找不出问题出在什么地方,因为没有异常信息和任何的提示,其实sun也用心良苦,他的API文档上对这个方法的注释如下:

public static int binarySearch(int[] a,
                               int key)
使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通过 sort(int[]) 方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。

 

参数:
a - 要搜索的数组
key - 要搜索的值
返回:
如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)插入点 被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为 a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

        哎!!!! 永远不要相信自己的直觉和代码对于程序员来说是非常非常重要的。 

 

分享到:
评论

相关推荐

    你清楚Arrays.binarySearch()方法的返回值吗?

    `Arrays.binarySearch()`方法允许我们在有序数组中查找指定元素,并返回该元素的索引。如果数组中不存在该元素,则会返回一个负数,这个负数的绝对值是插入该元素位置的前一个位置。 首先,让我们详细了解一下`...

    JAVA基于Arrays.sort()实现数组升序和降序

    在 Java 中,排序数组是非常常见的操作之一,而 Java 提供了多种方式来实现数组的排序,其中一种常用的方法是使用 Arrays.sort() 方法。今天,我们将详细介绍如何使用 Arrays.sort() 方法来实现数组的升序和降序排序...

    System.arraycopy和Arrays.copyOf

    `System.arraycopy` 和 `Arrays.copyOf` 都是Java中用于复制数组的方法,但它们在使用和处理异常情况上有所不同。这两个方法在处理数组复制时,提供了便利和效率,但各有其适用场景。 `System.arraycopy` 是一个...

    Java.binarySearch.docx

    在Java编程语言中,`binarySearch()`方法是`java.util.Arrays`类的一个静态方法,它采用二分查找算法来高效地在有序数组中查找指定的元素。二分查找是一种在有序数据集合中寻找目标值的算法,其效率远高于线性搜索。...

    java arrays类.docx

    int index = Arrays.binarySearch(array, 3); System.out.println("元素 3 的索引:" + index); // 复制数组 int[] copiedArray = Arrays.copyOf(array, 3); System.out.println(Arrays.toString(copiedArray)...

    Java中Arrays.asList()方法详解及实例

    Java中Arrays.asList()方法详解及实例 Arrays.asList()方法是Java中一个常用的方法,它将数组转换为列表。该方法的签名为`public static <T> List<T> asList(T... a)`,它可以接受变长参数,通常情况下是一个数组...

    java的Arrays类的应用.doc

    例如,`Arrays.binarySearch(array1, 3)`会返回元素3在`array1`中的位置,如果元素不存在,返回负数。 5. **数组克隆**: - `clone()`方法可以创建数组的一个副本。在示例中,`array2 = array1.clone()`创建了`...

    Java Arrays.asList使用方法解析

    "Java Arrays.asList使用方法解析" ...Java Arrays.asList使用方法解析是一个非常重要的知识点,需要我们牢记Arrays.asList方法返回的ArrayList对象的行为与我们通常使用的List集合不同,以避免在编程中出现错误。

    Java用Arrays.asList初始化ArrayList实例方法

    Java中使用Arrays.asList初始化ArrayList实例方法 在 Java 中,使用 Arrays.asList 方法可以快速创建一个 List 集合,但是需要注意的是,这个方法返回的 ArrayList 并不是 java.util.ArrayList 对象,而是一个内部...

    Java binarysearch方法原理详解

    int x1 = Arrays.binarySearch(a, 5); int x2 = Arrays.binarySearch(a, 4); int x3 = Arrays.binarySearch(a, 0); int x4 = Arrays.binarySearch(a, 10); System.out.println(x1+" "+x2+" "+x3+" "+x4); } } ...

    深入理解java中Arrays.sort()的用法

    "深入理解Java中Arrays.sort()的用法" 在Java中,Arrays.sort()是一个非常重要的方法,它可以对数组进行排序。该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用。但是sort()的参数有好几种,基本上...

    Java Arrays.sort和Collections.sort排序实现原理解析

    Java中的`Arrays.sort()`和`Collections.sort()`是两个常用的排序函数,它们分别用于对数组和集合进行排序。这两个函数在内部实现上有所不同,但都基于高效的排序算法。 首先,`Collections.sort()`方法在处理列表...

    android多语言strings.xml,arrays.xml转xls与xls转xml脚本程序

    `strings.xml`和`arrays.xml`文件是Android资源文件中的核心组件,用于存储应用程序中的文本和数组数据。这些文件通常包含不同语言的字符串资源,以便在不同地区展示相应的本地化内容。 本话题涉及一个脚本程序,它...

    java.Arrays.md

    项目中碰到的,记录一下

    JAVA中工具类Arrays和异常处理的实例操作.doc

    `Arrays.binarySearch()`方法可以实现高效的二分查找。这种方法要求数组事先已经排序。该方法返回查找元素在数组中的索引位置,如果未找到则返回负数。 **示例代码**: ```java System.out.println(Arrays.binary...

    Apress.PHP.Arrays.Single.Multi-dimensional.Associative.and.Object.Arrays.

    Apress.PHP.Arrays.Single.Multi-dimensional.Associative.and.Object.Arrays.in.PHP.7.1484225554.rar 最新书籍,精讲PHP数组,文字版PDF

    Arrays.asList方法总结

    `Arrays.asList`方法是Java中一个非常实用的工具,它允许我们将数组转换为`List`对象,以便在处理数组时可以利用`List`接口提供的便利。然而,这个方法有一些特殊的特性和限制,需要我们理解清楚才能正确使用。下面...

    Java中Arrays类详解.docx

    - `binarySearch()`:在排序的数组中查找特定元素的索引,如果找不到则返回负值。 - `asList()`:将数组转换为`ArrayList`,这样就可以使用集合框架的方法。 总的来说,`Arrays`类极大地简化了对数组的操作,提供...

    PHP.Arrays.in.PHP.7

    Gain an in-depth understanding of PHP 7 arrays. After a quick overview of PHP 7, each chapter concentrates on single, multi-dimensional, associative, and object arrays. PHP Arrays is a first of its ...

    java中的arrays.sort()代码详解

    "Java中的Arrays.sort()代码详解" Arrays.sort()是Java中的一种排序算法,该方法可以对数组进行排序,具体来说,它可以对基本类型数组和对象数组进行排序。在本文中,我们将详细介绍Arrays.sort()的使用方法,包括...

Global site tag (gtag.js) - Google Analytics