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属性的值,负数代表所查找的数组中没有目标数,并且该负数变成正数后,是该目标数应该插入数组的下标。另一种情况是返回目标数在数组的位置。
优缺点:
优点:程序员可以直接使用该函数,并不需要再次手写。
缺点:缺点非常明显,内存消耗会比较大。因为调用时需要将整个数组进行拷贝,如果数组很大,内存消耗很明显。