arrays.binarysearch 是 java 中基于二分查找的高效搜索方法,时间复杂度 o(log n),但仅适用于已排序数组;返回匹配索引或 -(插入点)-1,要求升序或显式提供 comparator,不验证排序状态。

Arrays.binarySearch 是 Java 中用于在已排序数组中快速查找元素的工具方法,它基于二分查找算法,时间复杂度为 O(log n),远优于线性遍历的 O(n)。但要注意:它只适用于已排序数组,且对未排序数组调用将导致结果不可预测。
基本用法与返回值含义
该方法有多个重载版本,最常用的是:
- int binarySearch(int[] a, int key) —— 查找基本类型数组
- int binarySearch(Object[] a, Object key) —— 查找对象数组(要求元素实现 Comparable 或传入 Comparator)
返回值有明确语义:
- 若找到,返回匹配元素的索引(≥ 0)
- 若未找到,返回 -(插入点) - 1,其中“插入点”是使数组保持有序时 key 应插入的位置(即第一个大于 key 的元素索引,或数组长度)
例如:数组 [1, 3, 5, 7] 中查找 6,返回 -4(因为 6 应插在索引 3 处 → -(3) - 1 = -4)。
使用前提:必须确保数组已排序
binarySearch 不会验证排序状态。如果数组无序,结果既不是正确索引,也不符合插入点规则。
- 升序是默认假设;若数组为降序,需自行提供 Comparator(如 Collections.reverseOrder())
- 建议在调用前加断言或日志(尤其在测试/调试阶段):assert isSorted(arr) : "Array must be sorted";
- 若不确定是否有序,可先调用 Arrays.sort(),但注意这会改变原数组顺序,且增加 O(n log n) 开销
处理重复元素与自定义比较逻辑
当数组含重复值时,binarySearch 只保证返回「其中一个匹配位置」,不承诺是第一个或最后一个。
- 如需定位左边界(首个等于 key 的位置),可用 Arrays.binarySearch 配合手动向左扫描,或改用 Arrays.stream().filter(...).findFirst()(小数据量)
- 对非基本类型(如 String、自定义类),必须确保元素可比:要么实现 Comparable,要么传入 Comparator
- 示例:按字符串长度查找 String[] arr = {"a", "bb", "ccc"};,可用 binarySearch(arr, "xx", Comparator.comparing(String::length))
常见陷阱与替代方案
容易忽略的关键细节:
- 基本类型数组和包装类数组不能混用(int[] 和 Integer[] 调用不同重载,后者走对象版,可能触发自动装箱/空指针)
- 对象数组中含 null 时,若 comparator 不支持 null,会抛 NullPointerException
- 若仅需判断存在性(不需要索引),用 Arrays.stream(arr).anyMatch(x -> x == key) 更直观,但性能差;高频查找建议维持排序+binarySearch
对于动态集合,考虑用 TreeSet 或 TreeMap,它们内部基于红黑树,天然支持 O(log n) 查找且自动维护有序。











