Collections.binarySearch要求列表必须预先升序排序或使用匹配的Comparator,否则结果不可预测;找到返回非负索引,未找到返回-(插入点)-1;使用自定义Comparator时排序和查找必须一致;需注意null处理与泛型类型兼容性。

Collections.binarySearch 是 Java 提供的对已排序的 List进行二分查找的便捷工具,它不改变原列表,也不要求列表是数组;但前提是列表必须按升序排列(或使用自定义 Comparator 保持一致顺序)。
前提:列表必须有序
binarySearch 不会自动排序,如果传入无序列表,结果不可预测(可能找不到、返回负数、甚至误判存在)。务必确保调用前已完成排序:
- 升序自然排序(元素实现 Comparable,如 Integer、String):
Collections.sort(list) - 自定义顺序:用
Collections.sort(list, comparator)排序,并在 binarySearch 中传入相同 comparator
基本用法:查找元素并返回索引
返回值含义明确:
- ≥ 0:找到,返回该元素在列表中的索引位置
- < 0:未找到,返回
-(insertion point) - 1,其中 insertion point 是该元素应插入的位置(维持有序),即~return或-return - 1就是插入点
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
List<Integer> list = Arrays.asList(1, 3, 5, 7, 9);Collections.sort(list); // 确保有序
int idx = Collections.binarySearch(list, 5); // 返回 2
int notFound = Collections.binarySearch(list, 4); // 返回 -3 → 插入点为 2
使用自定义比较器时必须匹配
若列表按特定规则排序(比如按字符串长度),binarySearch 必须传入同一个 Comparator,否则逻辑错乱:
- 排序时:
Collections.sort(list, Comparator.comparing(String::length)) - 查找时:
Collections.binarySearch(list, "hi", Comparator.comparing(String::length))
漏传或传错 Comparator,即使元素存在也可能返回负数。
注意类型安全与 null 处理
元素类型需统一,且 Comparable 实现或 Comparator 必须能处理待查对象:
- 列表含 null 时,自然排序会抛 NullPointerException;如需支持 null,Comparator 需显式处理(如
Comparator.nullsFirst()) - 查找 null 时,Comparator 也必须允许比较 null,否则运行时报错
- 泛型类型需兼容,例如
List<Number>中存 Integer,查找 Double 可能因 equals 判定失败而找不到

















