java中二分查找需集合有序且支持随机访问,可用arrays.binarysearch()或collections.binarysearch()实现o(log n)检索;数组返回索引或插入点,list需为arraylist等随机访问类型,treeset等应改用ceiling()/floor()方法。

Java 中没有直接暴露“二分查找”接口给普通集合,但只要集合有序且支持随机访问(即能通过下标快速获取元素),就能用 Arrays.binarySearch() 或 Collections.binarySearch() 实现 O(log n) 的检索——这正是二分查找思想的落地方式。
前提:集合必须是有序的
二分查找严格依赖顺序性。若数组或列表未排序,结果不可预测,甚至返回错误索引。常见做法:
- 使用前调用
Arrays.sort()或Collections.sort()排序(注意:仅需排序一次,后续多次查找才划算) - 若数据天然有序(如插入时维护有序性),可跳过排序步骤
- 对
TreeSet、TreeMap等红黑树结构,内部已有序,但不支持随机访问,无法直接二分;此时应改用其ceiling()、floor()等导航方法,时间复杂度同样是 O(log n),但原理不同
对数组:用 Arrays.binarySearch()
适用于原生数组(int[]、String[] 等)或包装类型数组(Integer[])。返回值含义明确:
- ≥ 0:表示目标元素所在索引
- 负数:表示插入点位置的取反减 1(例如返回 -3,说明应在索引 2 处插入以保持有序)
示例:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
int idx = Arrays.binarySearch(arr, 5); // 返回 2
int notFound = Arrays.binarySearch(arr, 4); // 返回 -3
对 List:用 Collections.binarySearch()
要求传入的 List 必须是随机访问型(如 ArrayList),否则性能退化为 O(n)。不支持 LinkedList 高效二分。
- 支持自定义
Comparator,适配复杂对象排序逻辑 - 若 List 是由
Arrays.asList()包装的数组,则底层仍为数组,可安全使用 - 注意:该方法不检查列表是否真有序,务必确保调用前已排序
示例:
List// 已按字典序排好
int pos = Collections.binarySearch(list, "banana"); // 返回 1
替代方案:自己写二分(适合泛型或特殊逻辑)
当需要控制比较逻辑、处理重复元素(如找最左/最右位置),或封装成工具方法时,手写更灵活:
- 基础版本只需 5–6 行,用
low/high双指针收缩区间 - 查最左位置:找到目标后继续向左收缩
high = mid - 1 - 查最右位置:找到目标后继续向右收缩
low = mid + 1 - 泛型写法需传入
Comparator super T>或要求元素实现Comparable
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










