Arrays.binarySearch支持对数组子区间二分查找,但要求该子区间必须已排序;搜索范围为[fromIndex, toIndex),返回值≥0表示找到的绝对索引,<0表示未找到且含插入点信息。

Arrays.binarySearch 本身不支持“按条件查找”,但可以通过指定起始和结束索引,实现对数组**某一段连续子区间**的二分查找。关键在于:它只在 fromIndex(含)到 toIndex(不含)之间搜索,且**要求该子区间必须已排序**。
确保子区间有序是前提
binarySearch 不会检查排序性,如果传入的范围乱序,结果不可预测(大概率返回负数,且无意义)。例如:
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6}; // 整体无序若查 binarySearch(arr, 2, 5, 8)(即索引 2~4:{5,7,9}),没问题;但查 binarySearch(arr, 5, 8, 4)(索引 5~7:{2,4,6})虽恰好有序,纯属巧合——不能依赖。
正确调用带范围参数的重载方法
使用以下签名之一(以 int 数组为例):
Arrays.binarySearch(int[] a, int fromIndex, int toIndex, int key)- 其他类型同理(如
double[]、Object[]等)
注意:toIndex 是**开区间上限**,即搜索范围为 [fromIndex, toIndex)。常见错误是把 toIndex 当成“最后一个索引”传入,导致越界或漏查。
处理返回值:区分找到与未找到
返回值规则与全数组查找一致:
- ≥ 0:表示
key在子区间内的索引位置(绝对索引,不是相对于fromIndex的偏移) - < 0:表示未找到,其值为
-(insertionPoint) - 1,其中insertionPoint是若插入key时应放的位置(仍属该子区间内)
例如,在 {10,20,30,40} 中查 25(范围 0~4),返回 -3 → 插入点为 2,即应在索引 2 处插入(保持升序)。
实际使用建议
- 先用
Arrays.sort(a, fromIndex, toIndex)对目标段排序(如果不确定是否有序) - 确认
fromIndex ≤ toIndex且均在数组合法索引范围内(0 ≤ fromIndex ≤ toIndex ≤ a.length) - 若需多次查同一子区间,排序一次即可,后续 binarySearch 都可复用

















