arrays.binarysearch支持对数组指定区间[left, right)进行二分查找,要求该子区间升序;查不到时插入点基于区间计算,返回值为原数组索引;对象数组含null且无comparator会抛npe。

Arrays.binarySearch 支持对数组的**指定区间**进行二分查找,关键在于理解它的索引边界语义和插入点计算规则。
区间参数是左闭右开 [fromIndex, toIndex)
调用形式为 Arrays.binarySearch(array, fromIndex, toIndex, key):
- fromIndex 必须 ≥ 0,包含该位置元素
-
toIndex 必须 ≤ array.length,不包含该位置元素(即实际搜索范围是索引
fromIndex到toIndex - 1) - 若
fromIndex > toIndex或任一越界,抛IllegalArgumentException - 例如:
binarySearch([1,3,4,5,8,9], 1, 4, 4)在子数组[3,4,5]中查 4,返回索引 2(对应原数组下标 2)
查不到时的负数返回值按区间重新计算
插入点不再基于整个数组,而是相对于**指定区间**:
- 若 key 小于区间内所有元素,返回 -(fromIndex + 1)
- 若 key 大于区间内所有元素,返回 -(toIndex + 1)
- 若 key 应插入区间内部(比如在索引
fromIndex + k处),返回 -(fromIndex + k) - 1 - 例:
binarySearch([1,3,4,5,8,9], 1, 4, 2)查 2,在[3,4,5]中,2 应插在最前(即原数组索引 1),返回 -2(因为 -(1 + 1) = -2)
区间必须是已排序子段
整个数组有序 ≠ 任意子区间都可用 —— 但只要传入的 fromIndex 到 toIndex - 1 这一段本身升序,即可安全使用:
- 常见场景:在已全局排序的数组中,只查某时间范围、某分页数据等逻辑子集
- 不能传
fromIndex = 0, toIndex = array.length却指望它自动识别“局部逆序”——它仍按升序逻辑执行,结果未定义 - 校验建议:若区间来源不可信,可先用
Arrays.copyOfRange提取再查,避免误用原始数组越界或乱序部分
原始类型与对象类型区间查找一致
无论 int[]、String[] 还是泛型数组,区间重载方法的行为逻辑完全统一:
- 都要求目标区间升序
- 都返回相对于**原数组**的索引(不是子数组内部偏移)
- 负数含义均按上述区间规则解释,与数组总长无关
- 注意:对象数组若含
null,且未提供Comparator,运行时可能抛NullPointerException











