arrays.binarysearch高效前提为数组已升序排序,返回值≥0表示存在且为索引,

Arrays.binarySearch 不是“一调就灵”的万能查找函数,它高效的前提是严格守序、正确解读返回值、合理匹配使用场景。用对了,O(log n) 查找秒级响应;用错了,结果不可靠还难排查。
必须先排序,否则结果无意义
binarySearch 不检查也不维护数组顺序,只假设输入已是升序排列。传入乱序数组,返回值纯属偶然,既不能定位元素,也不能推导插入点。
- 每次查找前,确认是否已调用 Arrays.sort(arr) —— 动态生成的数组(如用户录入、计算结果)尤其容易遗漏这步
- 同一数组多次查找时,排序只需一次;后续所有 binarySearch 调用都复用该有序状态
- 若业务逻辑中数组可能被中途修改,需在修改后重新排序,再进行查找
看懂返回值:正数是位置,负数藏插入点
返回值不是简单的“找到/没找到”,而是携带明确位置语义的整数:
- ≥ 0:目标存在,数值即其索引(例如返回 2,表示 key 在 arr[2])
- < 0:目标不存在,此时 -(返回值 + 1) 就是它应插入的位置索引
- 例如返回 -4 → 插入点为 3;返回 -1 → 应插在开头(索引 0);返回 -7(数组长为 6)→ 应插在末尾(索引 6)
小数组不走二分,线性扫描反而更快
JDK 实际实现会自动优化:长度小于阈值(JDK 8 中为 21)时,直接遍历。这不是 bug,而是 CPU 缓存与分支预测带来的性能权衡。
- 不必为此改写逻辑 —— 对 10 个元素的数组调用 binarySearch,底层就是 for 循环
- 也不用刻意避免小数组调用 —— API 行为一致,语义清晰,代码可读性更高
- 真正影响效率的是无序数组误用,而非数组大小
灵活应对不同需求:范围查找与自定义比较
binarySearch 提供两个关键变体,解决实际开发中的常见扩展场景:
- 限定区间查找:binarySearch(arr, fromIndex, toIndex, key),仅在 [fromIndex, toIndex) 内搜索,适合分页数据、跳过脏数据段或局部更新后快速验证
- 自定义比较逻辑:binarySearch(arr, key, comparator),适用于对象数组、降序查找、忽略大小写字符串匹配等,Comparator 必须与数组实际排序方式一致
- 注意基本类型数组(如 int[])不能传 Comparator;对象数组若未实现 Comparable 且未提供 Comparator,运行时抛 NullPointerException











