Arrays.binarySearch返回负数时表示未找到,其值为-(插入点+1),插入点即元素应插入的索引;可用int pos = -(result + 1)或~result安全提取;适用于有序插入、边界查找等场景。

当 Arrays.binarySearch 返回负数,说明目标元素未找到,但这个负数不是随便写的——它编码了“如果插入该元素,应放在哪里”这一关键信息。理解它,就能轻松实现有序插入、去重合并、边界定位等操作。
负数的含义:插入点(insertion point)
返回值 -(insertionPoint + 1),其中 insertionPoint 是元素应插入的索引位置(保持数组升序)。换句话说:
- 若返回
-3,说明插入点是2(因为-(2 + 1) = -3); - 若返回
-1,插入点是0; - 若返回
-6,插入点是5; - 若返回正值或
0,表示找到了,值就是匹配元素的索引。
如何安全提取插入点
别手动加减硬算,用位运算或简单数学即可还原:
-
推荐写法:
int pos = -(result + 1);—— 清晰、无溢出风险; - 等价写法:
int pos = ~result;(按位取反),因为 Java 中~x == -(x + 1),适用于所有负结果; - 避免写
-result - 1,虽等价但可读性稍差。
典型使用场景
拿到插入点后,很多问题迎刃而解:
-
有序插入:用
pos作为ArrayList.add(pos, e)或手动数组移位的起始位置; - 查找左/右边界(如在重复元素中找第一个):先用 binarySearch 找到一个位置,再向左线性探查;插入点本身可作“不小于目标值的第一个位置”;
-
判断是否存在并获取位置:
if (result ; - 合并两个有序数组:对第二个数组每个元素 binarySearch 到第一个数组,用插入点决定放哪。
注意边界情况
插入点始终满足 0 ≤ insertionPoint ≤ array.length:
- 返回
-1→ 插入点为0(比所有元素都小); - 返回
-(array.length + 1)→ 插入点为array.length(比所有元素都大); - 数组为空时,任何查找都返回
-1,插入点为0,符合直觉。

















