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 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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()包装的数组,则底层仍为数组,可安全使用 - 注意:该方法不检查列表是否真有序,务必确保调用前已排序
示例:
立即学习“Java免费学习笔记(深入)”;
List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "cherry"));// 已按字典序排好
int pos = Collections.binarySearch(list, "banana"); // 返回 1
替代方案:自己写二分(适合泛型或特殊逻辑)
当需要控制比较逻辑、处理重复元素(如找最左/最右位置),或封装成工具方法时,手写更灵活:
- 基础版本只需 5–6 行,用
low/high双指针收缩区间 - 查最左位置:找到目标后继续向左收缩
high = mid - 1 - 查最右位置:找到目标后继续向右收缩
low = mid + 1 - 泛型写法需传入
Comparator super T>或要求元素实现Comparable

















