arrays.binarysearch仅适用于已排序升序数组,返回索引或插入点编码值;乱序结果不可预测;搜索区间为[left, right),返回值≥0表示找到,

Arrays.binarySearch 不是“万能查找工具”,它只在数组已排序的前提下,用二分逻辑快速定位目标——查得到返回索引,查不到返回插入点编码值。理解它怎么算、在哪停、为什么返回负数,比记住语法更重要。
它只认升序,不校验也不提醒
binarySearch 假设你传进来的数组从 fromIndex 到 toIndex - 1 这一段是严格升序的。它不会检查,也不会报错,更不会帮你排序。如果这段乱序,结果就不可预测:可能返回错误正数、奇怪负数,甚至偶尔“碰巧对”——但那是巧合,不是功能。
- 升序是硬前提,降序或部分有序(比如旋转数组)必须先转换或换算法
- 对象数组含 null?没传 Comparator 就调用,运行时直接抛 NullPointerException
- 不确定是否有序?宁可先 Arrays.copyOfRange 提取子段再 sort,也别赌运气
区间查找:[fromIndex, toIndex) 的真实含义
调用 Arrays.binarySearch(array, fromIndex, toIndex, key) 时,搜索范围是左闭右开区间——包含 fromIndex 位置元素,不包含 toIndex 位置元素。也就是说,实际查的是索引 fromIndex 到 toIndex - 1 这些元素。
一款AI演示文稿工具,主要用于DeepSeek AI加持,输入主题生成专业PPT,支持Word/PDF等45种文档导入,职场汇报、教学提案轻松搞定,适合需要提升相关任务效率的用户。
- fromIndex 必须 ≥ 0,toIndex 必须 ≤ array.length;否则直接抛 IllegalArgumentException
- 返回的索引始终是原数组中的绝对位置,不是子区间的相对偏移
- 查不到时的负数,插入点也是相对于这个区间计算的:比如在 [1,3,4,5,8,9] 中查 2,区间 [1,4) 对应子数组 [3,4,5],2 应插在最前(原数组索引 1),返回 -2
返回值不是“有没有”,而是“在哪、该插哪”
返回值携带双重信息:
- ≥ 0:找到,数值就是目标在原数组中的索引
- < 0:没找到,但隐含插入点 —— 插入点 = -(返回值 + 1),即第一个 ≥ key 的元素位置,或数组末尾
- 判断是否存在,必须写 idx >= 0,不能用 idx != -1(否则索引 0 会被误判)
- 插入点可用于维护有序结构:比如 List.add(insertionPoint, key),或判断前缀匹配时定位候选词
小数组不走二分,这是性能优化不是 bug
JDK 实现中,长度小于阈值(JDK8 是 21)的数组会直接线性扫描。这不是偷懒,而是现代 CPU 缓存和分支预测让短距离遍历比反复计算中点更快。
- 你传一个长度为 10 的数组,binarySearch 内部其实是 for 循环
- 大数组才启用安全二分:用 low + (high - low) / 2 防整数溢出,循环条件是 low
- 所有重载版本(int[]、String[]、带 Comparator 的)底层逻辑一致,只是比较方式不同










