arrays.binarysearch要求数组必须已升序排列,返回值≥0表示命中并给出下标,负数表示未找到且可按-(index+1)计算插入点;未排序数组结果不可靠,需先调用arrays.sort()。

Arrays.binarySearch 不是“查得到就返回索引,查不到就返回 -1”的简单工具——它是一套精确编码位置信息的高效机制,前提是数组必须已升序排列。
必须先排序,且不验证顺序
binarySearch 本身不做任何排序或校验。传入未排序数组,结果完全不可靠:可能返回错误正数索引,也可能返回看似合理的负数,但插入点毫无意义。
- 推荐做法:数据加载后立即排序,如
Arrays.sort(empIds);若需保留原数组,用int[] sorted = empIds.clone(); Arrays.sort(sorted); - 降序查找不能直接用,必须显式传 Comparator,例如
Arrays.binarySearch(arr, key, Collections.reverseOrder()) - 数据库或 API 返回的数据,即使文档写“按 ID 升序”,也建议加简易校验(尤其在测试环境)
返回值不是布尔标志,而是位置编码
返回整数携带双重含义:≥ 0 表示命中,数值即真实下标;
- 正确判断是否存在:
if (index >= 0) { /* 找到了 */ },而非if (index != -1) - 计算插入点统一用公式:
int insertionPoint = -(index + 1);该位置即保持升序时应插入的下标(从 0 开始) - 例如在
[1, 3, 5, 7]中查4得-3→ 插入点为-(−3 + 1) = 2,即插在3和5之间
支持区间查找与自定义比较逻辑
可在子范围内搜索,或按非自然顺序比较,但规则严格:
- 区间调用形如
Arrays.binarySearch(arr, from, to, key),范围是左闭右开[from, to),越界会抛IllegalArgumentException - 区间内必须局部有序;插入点计算基于该区间起点,例如在
[1,3,4,5,8,9]的[1,4)(即[3,4,5])中查2,返回-2(应插在原数组索引 1 处) - 对象数组若含
null,未传 Comparator 时会触发NullPointerException;字符串忽略大小写查找可传String.CASE_INSENSITIVE_ORDER
类型匹配与性能关键细节
选错重载方法会导致行为异常,尤其在基本类型与包装类混用时:
-
int[]必须用binarySearch(int[], int);若误传Integer[]或调用对象版,可能引发自动装箱、空指针或逻辑错乱 - 工号、ID 等纯数字场景,优先用
int[]:无 null 风险、内存紧凑、无装箱开销 - 重复元素存在时,只返回其中一个位置,不保证是首/末次出现;需边界定位请配合手动扫描或改用
Arrays.stream().filter(...).findFirst()(小数据量适用)











