Arrays.binarySearch的查找范围是左闭右开的连续索引区间[fromIndex, toIndex),仅在此子数组片段内执行二分查找,要求该片段本身升序有序;越界抛ArrayIndexOutOfBoundsException,未命中时插入点基于原数组绝对索引计算。

Arrays.binarySearch 的查找范围限制,核心在于它只在你明确指定的连续索引区间内执行二分查找,且这个区间必须本身有序——不是“逻辑上有序”,而是该子数组片段在原数组中物理连续、且已按升序排列。
查找范围是左闭右开的连续索引段
当你调用 Arrays.binarySearch(arr, fromIndex, toIndex, key) 时,方法只看 arr[fromIndex] 到 arr[toIndex - 1] 这一段(包含起始,不包含结束)。超出这个范围的元素完全被忽略,哪怕它们更接近目标值或恰好等于目标值。
- 例如
int[] arr = {1, 5, 3, 7, 9, 2},即使你传入fromIndex=0, toIndex=3,它只查前三个元素{1, 5, 3}——但这段本身无序,结果不可靠 - 正确做法是:先确保整个数组或至少该子区间已排序。常见场景是数组全局有序,你只想查其中某段,比如“查后半部分有没有某个值”
范围边界必须合法,否则抛异常
fromIndex 和 toIndex 必须满足 0 ≤ fromIndex ≤ toIndex ≤ arr.length。越界会直接触发 ArrayIndexOutOfBoundsException。
-
fromIndex == toIndex是允许的(空区间),此时一定查不到,返回-(fromIndex + 1) -
toIndex == arr.length表示查到末尾,这是常用写法,比如Arrays.binarySearch(arr, 2, arr.length, 8) - 不能写
toIndex > arr.length,哪怕只是超 1,也会崩溃
未命中时的插入点仍相对于原数组索引
返回负值时,公式仍是 -(插入点) - 1,而这个“插入点”指的是:如果把 key 插入当前查找范围内,它应该放在该子区间的哪个**绝对索引位置**(不是子区间内的相对位置)。
- 例如
int[] arr = {1, 3, 5, 7, 9},调用Arrays.binarySearch(arr, 1, 4, 6)(查索引 1~3 即{3,5,7}) - 6 不在其中,应插入到
7的位置,也就是原数组索引 3 → 返回-(3) - 1 = -4 - 注意:不是返回
-2(即子区间内第 2 位),而是原数组的绝对位置
范围外的值不影响结果,也不参与比较
binarySearch 不会扫描范围外的元素,也不会用它们校验有序性。它假设你传入的 [fromIndex, toIndex) 这一段是独立有序的。
- 如果该段实际无序(比如你误以为某段局部有序),结果毫无意义
- 如果该段有序,但前后元素破坏整体顺序(如
{1,2,9,4,5}中查[2,4)即{9,4}),同样无效——二分算法依赖局部单调性 - 安全做法:要么全局排序后查任意子范围;要么单独提取子数组、排序、再查(但失去原索引映射)

















