Arrays.binarySearch()仅适用于已排序数组,时间复杂度O(log n),未排序时结果不可靠;需预先调用sort()或确保有序;对象数组需实现Comparable或传入Comparator;List应使用Collections.binarySearch()。

Java 中的 Arrays.binarySearch() 是专为**已排序数组**设计的二分查找工具,能在 O(log n) 时间内完成检索,但必须满足前提条件——数组必须严格升序(或按指定 Comparator 有序),否则结果不可预测。
确保数组已排序是前提
binarySearch 不负责排序,只做查找。若传入未排序数组,返回值无意义(可能负数,也可能碰巧命中,但不保证正确)。
- 升序基本类型数组:直接调用
Arrays.sort(arr)预处理(注意:sort()本身是 O(n log n),仅需一次) - 对象数组:需实现
Comparable,或传入自定义Comparator - 常见误区:对 List 使用 binarySearch —— 必须先转为数组,或改用
Collections.binarySearch()(要求 list 已排序且支持随机访问)
正确调用 binarySearch 的三种方式
根据数据类型和比较逻辑选择对应重载方法:
-
Arrays.binarySearch(int[] a, int key):基础类型数组,如int[] nums = {1, 3, 5, 7}; int idx = Arrays.binarySearch(nums, 5); // 返回 2 -
Arrays.binarySearch(Object[] a, Object key):对象数组,元素需实现 Comparable -
Arrays.binarySearch(T[] a, T key, Comparator super T> c):自定义比较逻辑,例如按字符串长度查找:Arrays.binarySearch(words, "hello", Comparator.comparing(String::length))
理解返回值含义,避免误判
返回值不是简单的“找到/没找到”,而是带语义的整数:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ≥ 0:表示 key 在数组中的索引位置(例如返回 3 → 第 4 个元素匹配)
- < 0:表示未找到,其绝对值减 1 是 key 应插入的位置(即维持排序的最小下标),例如返回 -4 → 应插入到索引 3 处
- 判断是否存在:用
result >= 0,而非result != -1(因为未找到时可能是任意负数)
替代方案与边界提醒
binarySearch 仅适用于数组;若数据结构是 TreeSet 或 TreeMap,其 contains()、get() 本就是 O(log n),无需手动二分;若频繁增删,数组 + binarySearch 维护成本高,应考虑平衡树或跳表结构。
不复杂但容易忽略:每次调用前确认排序状态,尤其在多线程或动态更新场景中,建议封装为带校验的工具方法,或改用线程安全的有序集合。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










