Arrays.binarySearch()仅适用于已排序数组,返回目标索引或插入点补码;支持子区间查找(左闭右开),对重复元素返回任意匹配位置,使用时需确保有序、类型可比且线程安全。

Arrays.binarySearch() 是 Java 提供的高效二分查找工具,但**只适用于已排序的数组**。它返回目标元素的索引;若未找到,则返回一个负数(表示插入点的补码,即 -(插入位置) - 1)。
基本用法:必须确保数组已升序排列
该方法不检查数组是否有序,如果传入乱序数组,结果不可预测。
- 对
int[]、double[]、String[]等基本类型和引用类型数组都支持重载版本 - 推荐使用泛型版本(如
Arrays.asList(arr)配合Collections.binarySearch())处理自定义对象,需实现Comparable或传入Comparator - 示例:
int[] arr = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(arr, 5); // 返回 2
int notFound = Arrays.binarySearch(arr, 4); // 返回 -3(因为 4 应插在索引 2,故 -(2) - 1 = -3)
查找范围控制:指定起始与结束索引
可对数组的某一段子区间执行二分查找,避免复制子数组。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 方法签名:
binarySearch(type[] a, int fromIndex, int toIndex, type key) -
fromIndex包含,toIndex不包含(左闭右开) - 越界会抛出
IllegalArgumentException(如fromIndex > toIndex)或ArrayIndexOutOfBoundsException - 示例:
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
// 在索引 [2, 6) 即 {3,4,5,6} 中查找 5
int idx = Arrays.binarySearch(arr, 2, 6, 5); // 返回 4(原数组索引)
处理重复元素:返回任意一个匹配位置,不保证是第一个或最后一个
当数组含多个相同值时,binarySearch() 可能返回其中任一索引,无法直接用于找边界。
立即学习“Java免费学习笔记(深入)”;
- 若需查找“第一次出现位置”,可用
Arrays.binarySearch()配合手动向左线性扫描(小范围可行),或改用Arrays.stream().indexOf()(非二分,性能差) - 更稳妥的做法是自己实现 lowerBound / upperBound 逻辑,或借助
TreeSet、TreeMap等结构 - 注意:返回负值时,其对应插入点是“保持升序的最小合法位置”,可用于定位重复块的边界
常见陷阱与注意事项
- 对
Object[]使用时,元素必须实现Comparable,否则抛ClassCastException - 浮点数数组慎用:因
Double.NaN和正负零比较特殊,建议优先用Double.compare()自定义比较器 - 不能用于未排序数组——即使结果偶然正确,也不具备可移植性和可维护性
- 多线程环境下,确保查找期间数组不被其他线程修改,否则行为未定义

















