Collections.binarySearch()要求List已升序排序,否则结果不可预测;返回≥0为索引,<0时为-(插入点)-1;适用于ArrayList等随机访问列表,不推荐LinkedList;需先排序并注意null和Comparator处理。

Collections.binarySearch() 是 Java 集合工具类中用于在已排序的 List(如 ArrayList、LinkedList)中执行二分查找的静态方法。它不适用于 Set 或未排序的列表,否则结果不可预测。
前提条件:列表必须已升序排序
binarySearch 要求传入的 List 已按自然顺序(或指定 Comparator)排好序。如果未排序,返回值无意义(可能为负数,但不代表插入点准确)。
- 推荐使用 Collections.sort(list) 先排序(针对 Comparable 类型)
- 若元素类型未实现 Comparable,需提供自定义 Comparator
- 注意:List 必须是支持随机访问的(如 ArrayList 效率高;LinkedList 虽可查,但因 get(index) 是 O(n),整体退化为 O(n log n))
基本用法与返回值含义
方法签名:
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)或带比较器的版本:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
返回值:
- ≥ 0:表示找到,返回该元素的索引位置
- < 0:表示未找到,返回值为 -(插入点) - 1,其中“插入点”是使列表保持有序时 key 应插入的位置(即第一个大于 key 的元素下标,或 list.size())
实用示例(含错误规避)
正确写法:
List<Integer> nums = Arrays.asList(1, 3, 5, 7, 9);Collections.sort(nums); // 确保有序(本例已有序,但习惯性加更安全)
int index = Collections.binarySearch(nums, 5); // 返回 2
int notFound = Collections.binarySearch(nums, 4); // 返回 -3 → 插入点 = 2
常见错误:
- 对未排序 List 直接调用 → 结果无效
- 传入 null 元素且无 Comparator → 抛 NullPointerException
- 用 LinkedList 做高频查找 → 性能差,应优先选 ArrayList
配合插入场景:获取插入位置
当查找失败时,可通过返回值快速算出插入位置,避免重复遍历:
int pos = Collections.binarySearch(list, key);if (pos pos = -(pos + 1); // 转换为实际插入下标
list.add(pos, key);
}
这样可在 O(log n) 定位、O(n) 插入(受限于 ArrayList add(index)),比线性扫描插入高效。

















