arrays.binarysearch仅适用于已排序数组,基于二分查找,返回目标索引(≥0)或插入点编码(<0),使用前须确保有序,注意类型匹配与重载选择。

Arrays.binarySearch 只能在已排序的数组中正确返回目标元素的位置,否则结果不可预测——它不负责排序,也不验证顺序。
必须先确保数组有序
binarySearch 基于二分查找算法,要求数据单调递增(或按指定 Comparator 有序)。如果数组乱序,即使找到值,下标也无意义;更常见的是返回负数,表示插入点。
- 升序数组:用
Arrays.sort(arr)预处理(注意原始数组会被修改) - 不想改原数组?复制一份再排序:
int[] sorted = arr.clone(); Arrays.sort(sorted); - 降序查找需传入自定义 Comparator,例如:
Arrays.binarySearch(arr, key, Collections.reverseOrder())
理解返回值的含义
返回值不是“是否找到”的布尔值,而是实际下标或插入点编码:
- ≥ 0:表示找到,值即为该元素在数组中的索引
- < 0:表示未找到,其绝对值减 1 是该元素应插入的位置(保持有序),即
-insertionPoint - 1 - 例如在
[1,3,5,7]中查4,返回-3,说明应插在索引2(因为-(-3) - 1 = 2)
注意类型匹配与重载选择
Java 提供多组重载,务必选对参数类型和排序依据:
- 基本类型数组(如
int[])直接用对应类型方法:Arrays.binarySearch(int[], int) - 对象数组(如
String[])若用自然序,调用Arrays.binarySearch(Object[], Object) - 自定义类必须实现
Comparable,或显式传入Comparator - 切勿把
int[]当作Object[]传——会调用错误重载,导致编译通过但逻辑崩溃
替代方案:避免重复排序开销
如果需频繁查询同一组数据,排序一次、多次 binarySearch 是高效做法;但若只查一两次,线性扫描(for 循环)可能更快——binarySearch 时间复杂度 O(log n),但常数因子略高,且依赖预排序成本。
- 大批量查询 + 静态数据 → 排序 + binarySearch
- 单次查询或小数组(如长度
- 需要范围查询或存在多个相同值?binarySearch 找到的只是其中一个位置,不能保证是第一个或最后一个











