arrays.binarysearch 不检查数组有序性,仅按升序假设执行二分查找;输入无序会导致错误结果;子区间查找也要求该区间局部有序。

Arrays.binarySearch 不做任何有序性检查,它只按“数组已升序排列”这一前提执行二分逻辑。只要传入,就直接算中间、比大小、缩范围——无论数组实际是否有序,它都照常返回一个整数。这个返回值本身不携带“校验失败”信号,错误的输入只会导致错误的输出。
查找逻辑完全依赖升序假设
源码中 binarySearch0 的核心循环始终假定:左半段所有元素 ≤ 中间值,右半段所有元素 ≥ 中间值。一旦数组乱序,比如 {5, 1, 9, 3},算法在第一次取 mid=1 得到 a[1]=1 后,会误判 key=5 应该往右找(因 1
数组有序性必须由你来保障
binarySearch 不是“智能检测+查找”,而是“信任前提+计算”。验证方式只有两种:
- 写辅助方法遍历检查相邻元素:for (int i = 1; i
- 更稳妥的做法是:每次使用前调用 Arrays.sort()(基本类型)或 Arrays.sort(arr, comparator)(对象数组),确保“排序→查找”成对出现;若性能敏感,可将排序结果缓存为只读状态,避免重复开销
降序数组不能直接用,需转换视角
binarySearch 原生不支持降序。强行传入降序数组,结果必然错乱。可行方案有:
- 反转数组再查(适合一次性操作):Arrays.sort(arr, Collections.reverseOrder()),再 binarySearch
- 自定义 Comparator 实现“逻辑升序”:比如对 Long[] 按业务时间倒序存储,查找时用 Comparator.comparingLong(x -> -x),使比较行为等价于升序语义
- 手动实现反向二分(不推荐):绕过 Arrays 工具,自己写循环并调整比较方向,易出错且失去通用性
子区间查找仍要求局部有序
使用四参数重载 binarySearch(arr, from, to, key) 时,算法只在 [from, to) 范围内运行,但它依然要求该子区间本身是升序的。例如在完整数组 {1,5,3,7,9} 中,若传入 from=1, to=4(即子数组 {5,3,7}),该片段无序,结果无效。不能指望“只查一段”就能规避整体排序责任。











