arrays.binarysearch仅适用于已排序数组,未排序时需先调用arrays.sort();返回值≥0为找到的索引,负数表示未找到且其绝对值减1为插入位置。

Arrays.binarySearch 只能在已排序的数组中正确工作,直接对无序数组调用会返回错误结果(负数或任意无效索引)。
前提:确保数组已升序排序
二分查找依赖元素有序性。如果数组未排序,必须先调用 Arrays.sort():
- 对 int[]、double[] 等基本类型数组,直接用 Arrays.sort(arr)
- 对对象数组(如 String[]),默认按自然顺序排序;自定义类需实现 Comparable 或传入 Comparator
- 注意:排序会修改原数组。若不能改变原顺序,应复制一份再排序和查找
基本用法:查找目标值的索引
以 int 数组为例:
int[] arr = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(arr, 5); // 返回 2(找到,索引为2)
int notFound = Arrays.binarySearch(arr, 4); // 返回 -3(未找到,插入点为2,所以 -(2+1) = -3)
- 返回值 ≥ 0:表示找到,值即为元素在数组中的索引
- 返回值
- 对浮点数要小心 NaN 和正负零,建议优先用 Double.compare() 排序和查找
查找范围与泛型支持
可指定查找子区间(左闭右开):
int partial = Arrays.binarySearch(arr, 1, 4, 7); // 在索引 [1,4) 即 {3,5,7} 中找 7 → 返回 3(相对于原数组)
- 参数顺序:数组、起始索引(含)、结束索引(不含)、目标值
- 对对象类型(如 String[]),方法重载支持 Comparator,用于自定义比较逻辑
- 不支持泛型数组直接调用(如 List
),需转为基本类型数组或改用 Collections.binarySearch
常见误区提醒
容易出错的地方:
- 对未排序数组调用 → 结果不可预测,不是“找不到”,而是逻辑崩溃
- 混淆返回值含义:-1 不代表“在末尾插入”,而是“应在索引 0 处插入”(因为 -(0+1) = -1)
- 在含重复元素的数组中,只保证返回某一个匹配位置,不一定是第一个或最后一个
- 使用 Object 类型数组时,元素不能为 null(除非 Comparator 显式处理),否则抛 NullPointerException








