Arrays.binarySearch正确使用必须满足三个硬性条件:数组已升序排序、查找与排序逻辑一致、返回值准确解码;未排序时结果不可信,≥0表示找到索引,<0时插入点为-(返回值+1)。

Arrays.binarySearch 不是“一调就灵”的通用查找工具,它的正确使用依赖三个硬性条件:数组已升序排序、查找逻辑与排序逻辑一致、返回值被准确解码。跳过任一环节,结果就不可信。
必须先排序,且不能假设它已排好
binarySearch 从不验证数组是否有序,也不做任何预处理。传入乱序数组,它照样跑完二分流程,但返回值既不是真实索引,也不符合插入点规则——纯属计算巧合,毫无意义。
- 动态生成的数组(如用户输入、实时计算结果),每次查找前都应显式调用 Arrays.sort(arr)
- 若同一数组需多次查找,只在首次调用前排序一次即可,后续 binarySearch 可直接复用
- 对基本类型(int[]、double[] 等)用 Arrays.sort(arr);对对象数组(String[]、自定义类[]),确保排序与查找时用的是同一套比较逻辑(自然序或相同 Comparator)
返回值不是布尔值,而是带位置信息的整数
它返回的不是“找到了”或“没找到”,而是一个携带明确位置含义的 int:
- ≥ 0:表示找到,数值就是该元素在数组中的索引(例如返回 3,说明 key 在 arr[3])
- < 0:表示未找到,此时插入点 = -(返回值 + 1)(例如返回 -4,插入点是 3;返回 -1,插入点是 0)
- 这个插入点指:把 key 插入该位置后,数组仍保持升序——即第一个大于 key 的元素下标,或数组末尾
范围查找和自定义比较器要匹配排序方式
binarySearch 支持更精细的控制,但前提是与排序逻辑对齐:
- 查子区间:用 binarySearch(arr, from, to, key),注意范围是左闭右开 [from, to),且该子区间本身也必须有序
- 用 Comparator 查找:必须传入与排序时完全相同的 Comparator 实例(不能只是“同类”),否则顺序不一致,结果失效
- 降序数组不能直接用默认版本,需显式传入 Comparator.reverseOrder(),且排序时也必须用它
基本类型和对象数组别混用重载
int[] 和 Integer[] 调用的是两个完全不同的重载方法,行为差异明显:
- int[] 走原生比较,无装箱开销,性能高;Integer[] 走对象比较,可能触发自动装箱,且含 null 时易抛 NullPointerException
- 不要用 binarySearch(Object[], int) 去查 int[] 数组——编译可能通过,但运行时会报错或返回错误结果
- 含重复元素时,它只保证返回“某一个”匹配位置,不承诺是第一个或最后一个;如需左边界,得配合手动扫描或改用其他策略

















