Collections.binarySearch 返回目标元素索引或插入点:≥0 表示找到的索引,负数表示未找到时应插入的位置;要求 List 已排序且比较逻辑一致,否则结果不可靠。

Collections.binarySearch 是 Java 中用于在已排序的 List 中快速查找元素的标准方法,其底层基于二分查找算法,时间复杂度为 O(log n),远优于线性遍历的 O(n)。
前提条件:List 必须已按自然顺序或指定比较器排序
该方法**不会自动排序**列表。如果传入的 List 未排序,返回结果无意义(可能为负数,也可能偶然命中,但不可靠)。调用前需确保:
- 元素实现了
Comparable接口,且 List 已按自然序升序排列; - 或提供与排序时一致的
Comparator,否则比较逻辑不匹配会导致查找失败; - 重复元素存在时,返回任意一个匹配位置(不保证是第一个或最后一个)。
返回值含义:正数表示索引,负数表示插入点
返回值不是简单的“找到/没找到”,而是携带位置信息的整数:
- ≥ 0:表示目标元素在 List 中的索引位置;
- -(insertionPoint) - 1;
- 例如返回 -3,说明元素不在列表中,若要插入并维持有序,应放在索引 2 的位置(因为 -3 → -(insertionPoint)-1 = -3 ⇒ insertionPoint = 2)。
使用示例与常见误区
正确用法需严格匹配排序方式:
- 自然序查找:
Collections.binarySearch(list, target),要求 list 已用Collections.sort(list)排序; - 自定义比较器查找:
Collections.binarySearch(list, target, comparator),要求 list 是用同一 comparator 排序的(如Collections.sort(list, comparator)); - 错误做法:用 comparator 排序后,却用无参 binarySearch 查找——此时比较逻辑不一致,结果不可信。
替代方案与注意事项
若需更丰富的查找语义(如找左边界、右边界、范围查询),Collections.binarySearch 不够用,建议:
- 自行实现扩展版二分查找(如 lowerBound / upperBound);
- 使用 Guava 的
Lists.binarySearch(功能类似)或 Apache Commons Collections 的工具类; - 对不可变有序列表,可考虑
ImmutableSortedSet等结构,提供更安全的查找接口。











