Arrays.binarySearch要求数组必须预先升序排序,否则结果不可靠;返回值≥0表示找到并给出索引,<0则表示未找到且-(返回值+1)为插入位置;支持范围查找和自定义比较器,使用时需注意基本类型与引用类型的重载区别。

Arrays.binarySearch 是 Java 中最常用、最高效的内置二分查找工具,但它不是“拿来就能用”的黑盒——用错前提或误读返回值,结果就完全不可靠。
必须先排序,否则结果无意义
binarySearch 只对**已升序排列**的数组有效。它不负责排序,也不检测是否有序。如果传入未排序数组,返回值纯属巧合,毫无逻辑可言。
- 正确做法:调用前显式排序,例如 Arrays.sort(arr)
- 若数组动态生成(如素数列表、用户输入),务必在查找前完成排序
- 对同一数组多次查找时,只需排序一次,后续 binarySearch 均可复用
理解返回值:正数是索引,负数是插入点编码
返回值不是简单的“找到/没找到”,而是携带明确位置信息的整数:
- ≥ 0:表示目标值存在,数值即其在数组中的索引(从 0 开始)
- < 0:表示未找到,此时 -(返回值 + 1) 就是该值应插入的位置索引
- 例如返回 -4 → 插入点为 3;返回 -1 → 应插在开头(索引 0);返回 -7(数组长为 6)→ 应插在末尾(索引 6)
支持范围查找和自定义比较器
除了基础版本,binarySearch 还提供两个实用变体:
-
指定区间查找:
binarySearch(arr, fromIndex, toIndex, key)—— 仅在[fromIndex, toIndex)范围内搜索,适合分段处理或跳过无效区域 -
自定义排序逻辑:
binarySearch(arr, key, comparator)—— 适用于对象数组,或需按非自然顺序(如降序、忽略大小写)查找的场景
类型覆盖全面,但注意基本类型与引用类型差异
Arrays 提供了针对所有基本类型(int、double 等)和泛型对象的重载方法:
- 基本类型数组:直接比较数值,高效无装箱
- 对象数组:要求元素实现 Comparable,或传入 Comparator;null 值可能导致 NullPointerException
- 避免混用:不要用
binarySearch(Object[], int)查 int 数组,编译可能通过但运行出错


















