Arrays.binarySearch仅适用于已排序数组,返回目标索引或-(插入点)-1;使用前须用Arrays.sort()排序,对象数组需确保排序与查找时Comparator一致,且须选用匹配数组类型的重载方法。

Java 中 Arrays.binarySearch 只能在**已排序的数组**上正确使用,否则结果不可预测。它返回目标元素的索引(找到时),或一个负数(未找到时),这个负数可用于推算插入位置。
确保数组已排序
二分查找的前提是数组升序排列。如果未排序,必须先调用 Arrays.sort():
- 对基本类型数组(如
int[])直接排序 - 对对象数组(如
String[]),默认按自然顺序排序;自定义类需实现Comparable或传入Comparator
例如:
int[] arr = {5, 2, 8, 1};Arrays.sort(arr); // 变为 {1, 2, 5, 8}
int index = Arrays.binarySearch(arr, 5); // 返回 2
理解返回值含义
返回值不是简单的“-1 表示没找到”。它的规则是:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ≥ 0:表示找到,值即为目标元素在数组中的索引
- < 0:表示未找到,返回值为
-(插入点) - 1,其中“插入点”是该元素应插入的位置(保持有序)
比如在 {1, 3, 7, 9} 中查找 5,插入点是索引 2(放在 3 和 7 之间),所以返回 -3(因为 -(2) - 1 = -3)。
处理对象数组和自定义比较逻辑
对 String 等实现了 Comparable 的类,可直接使用;对自定义类或需要特殊排序规则时,必须配套使用相同 Comparator:
- 排序时用了
Arrays.sort(arr, comparator) - 查找时也必须用
Arrays.binarySearch(arr, key, comparator)
否则行为未定义——即使数组看起来“排好了”,但比较逻辑不一致,查找会失败。
注意数组类型和重载方法
Arrays.binarySearch 有多个重载版本,覆盖所有基本类型和 Object 数组。关键点:
- 不要对基本类型数组误用对象版本(如用
binarySearch(Object[], ...)查int[]),这会把整个数组当作一个对象,导致编译错误或运行时异常 - 对基本类型,优先使用对应类型的重载(如
binarySearch(int[], int)) - 对泛型集合(如
ArrayList),不能直接用此方法——需先转为数组,或改用Collections.binarySearch

















