使用Arrays.binarySearch()方法来判断
示例代码:
public static void main(String[] args) {
int[] array = {1, 3, 4, 2, 5, 6, 0};
System.out.println("排序前:" + Arrays.toString(array));
Arrays.sort(array);
System.out.println("排序后:" + Arrays.toString(array));
System.out.println(Arrays.binarySearch(array, 0));
}
结果如下:
返回了要搜索值0的下标,说明0这个数值在数组中是存在的。
为什么这里要排序后再调用Arrays.binarySearch()方法呢
先看看不排序示例代码:
public static void main(String[] args) {
int[] array = {1, 3, 4, 2, 5, 6, 0};
System.out.println("排序前:" + Arrays.toString(array));
System.out.println("排序后:" + Arrays.toString(array));
System.out.println(Arrays.binarySearch(array, 0));
}
输出结果:
这里就可以看到,明明0是存在数组中的,但是返回却是-1,代表搜不到这个值,和预期结果不符。
看看Arrays.binarySearch()源码分析下:
public static int binarySearch(int[] a, int key) {
//真正调用的还是binarySearch0()方法
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
//fromIndex默认传参就是0,所以low=0
int low = fromIndex;
//toIndex是数组的长度7,所以high=6
int high = toIndex - 1;
//循环判断
while (low <= high) {
//无符号右移1位,其实就是(low + high)/2,只是用移位运算更快
int mid = (low + high) >>> 1;
//取得中间下标mid的数值
int midVal = a[mid];
//如果midVal值小于要搜索的key,则认为key在mid+1下标和high下标之间
if (midVal < key)
//所以把low赋值成mid + 1
low = mid + 1;
//如果midVal值大于要搜索的key,则认为key在0下标和mid-1下标之间
else if (midVal > key)
//所以把high赋值成mid - 1
high = mid - 1;
else
//直到midVal等于key时,才退出循环,返回相应下标
return mid; // key found
}
//如果实在是搜不到,就返回-(low + 1)
return -(low + 1); // key not found.
}
从源码可以知道Arrays.binarySearch()采用的是二分法来搜索定位数据的,所以才需要先排序,而一旦返回负数,就说明没找到匹配值。
总结
这里分享了判断数组中是否包含了某个数值的另一种方法,有时候相比起循环遍历判断,也许它的效率会更高,在了解了Arrays.binarySearch()方法后,可以根据实际情况选择更好的方法。