Arrays.binarySearch(array, fromIndex, toIndex, key) 在左闭右开区间 [fromIndex, toIndex) 内查找,要求该子区间升序,返回值为原数组绝对索引;越界抛异常,空区间返回 -(fromIndex + 1)。

区间是左闭右开的连续索引段
调用 Arrays.binarySearch(array, fromIndex, toIndex, key) 时,方法只在 [fromIndex, toIndex) 范围内查找,即包含 fromIndex 位置的元素,不包含 toIndex 位置的元素。实际搜索的是 array[fromIndex] 到 array[toIndex - 1] 这一段。
边界必须合法:
- fromIndex ≥ 0 且 ≤ toIndex
- toIndex ≤ array.length
- 若 fromIndex == toIndex,区间为空,一定查不到,返回 -(fromIndex + 1)
- 越界(如 toIndex > array.length)会直接抛 ArrayIndexOutOfBoundsException
子区间必须本身升序才可靠
binarySearch 不验证数组整体是否有序,它只依赖你传入的那段是否升序。即使整个数组已排序,若你指定的 [fromIndex, toIndex) 段内部乱序,结果就不可信。
常见安全做法:
- 全局排序后,再查任意子区间(最常用)
- 若区间来源不确定,先用 Arrays.copyOfRange(array, fromIndex, toIndex) 提取子数组,单独排序再查(但会丢失原数组索引关联)
- 不能指望 binarySearch 自动识别“局部逆序”——它始终按升序逻辑执行,错用会导致返回错误正数或任意负数
返回值始终基于原数组索引
无论是否指定区间,返回的索引都是相对于原始数组的绝对位置,不是子区间的内部偏移。
判别逻辑统一:
- 返回值 ≥ 0 → 找到,该数值就是元素在原数组中的下标
- 返回值
例如:Arrays.binarySearch([1,3,4,5,8,9], 1, 4, 2) 在子数组 [3,4,5] 中查 2,应插在索引 1 处(原数组位置),返回 -2(因为 -(1 + 1) = -2)。
负数返回值的插入点还原规则
未命中时,返回值为 -(插入点) - 1,其中“插入点”指在指定区间内、为保持升序应插入的**原数组绝对索引**。
还原方式有两种(结果相同):
- int insertPos = -(index + 1)
- int insertPos = ~index(位取反,等价于上式)
举例:在 [1,3,5,7,9] 的 [1,4)(即 [3,5,7])中查 6,应插入原数组索引 3(7 的位置),返回 -4;还原得 ~(-4) == 3,正确。

















