Arrays.binarySearch
方法的底层实现是使用经过优化的二分查找算法。以下是大致的二分查找算法实现步骤:
- 首先,确定搜索范围的起始索引
low
和结束索引high
,它们分别初始化为数组的起始位置和结束位置。 - 在每一轮循环中,计算中间元素的索引
mid
,通过(low + high) / 2
计算得到。如果目标元素等于中间元素,则返回中间元素的索引。 - 如果目标元素小于中间元素,则更新
high = mid - 1
,即将搜索范围缩小到左半部分;如果目标元素大于中间元素,则更新low = mid + 1
,即将搜索范围缩小到右半部分。 - 不断重复步骤 2 和步骤 3,直到找到目标元素或者搜索范围为空(即
low > high
),此时返回一个负数值,表示目标元素应该插入的位置的负数形式减一(即-(low + 1)
)。
在实际实现中,Arrays.binarySearch
方法还会考虑一些边界情况,比如输入数组为空、目标元素小于数组第一个元素或大于数组最后一个元素等情况。此外,对于基本数据类型的数组和对象数组,其比较方式可能略有不同。
总体而言,Arrays.binarySearch
方法采用了高效的二分查找算法来在已排序的数组中搜索目标元素,以实现快速查找的目的。
函数的源码如下:
/**
* public static int binarySearch(int[] a, int key) {
* return binarySearch0(a, 0, a.length, key);
* }
* private static int binarySearch0(int[] a, int fromIndex, int toIndex,
* int key) {
* int low = fromIndex;
* int high = toIndex - 1;
*
* while (low <= high) {
* int mid = (low + high) >>> 1;
* int midVal = a[mid];
*
* if (midVal < key)
* low = mid + 1;
* else if (midVal > key)
* high = mid - 1;
* else
* return mid; // key found
* }
* return -(low + 1); // key not found.
* }
*
*/
会返回两种int属性的值,负数代表所查找的数组中没有目标数,并且该负数变成正数后,是该目标数应该插入数组的下标。另一种情况是返回目标数在数组的位置。
优缺点:
优点:程序员可以直接使用该函数,并不需要再次手写。
缺点:缺点非常明显,内存消耗会比较大。因为调用时需要将整个数组进行拷贝,如果数组很大,内存消耗很明显。