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)