Arrays.binarySearch要求数组必须升序排序,否则结果不可预测;其原理依赖中位数划分区间,无序时逻辑失效;需先Arrays.sort()再查找,或克隆后排序;返回索引≥0表示找到,<0表示未找到且含插入位置信息;适用静态数据批量查询,不适用于频繁变动集合。

Arrays.binarySearch 要求目标数组必须已按升序排序,否则结果不可预测——这不是“建议”,而是硬性前提。
为什么必须先排序?
二分查找依赖“中间元素能划分左右区间”的逻辑。如果数组无序,比如 [5, 1, 8, 3],取中位数 8 后无法判断目标值该往左还是右搜,算法会直接跳过正确位置,返回负数(表示插入点),但这个插入点也失去实际意义。
常见误区:调用 binarySearch 前没确认是否已排序,或误以为它会自动排序。
排序与查找的典型配合写法
Java 中最稳妥的组合是先用 Arrays.sort(),再查;若需保持原数组顺序,应复制后再排序查找:
- 对原始数组操作:先
Arrays.sort(arr),再Arrays.binarySearch(arr, key) - 不破坏原数组:用
int[] copy = arr.clone(); Arrays.sort(copy); int idx = Arrays.binarySearch(copy, key); - 注意基本类型数组(如
int[])和引用类型(如String[])都支持,但引用类型需确保元素实现Comparable或传入Comparator
理解返回值含义
binarySearch 返回的是索引,不是布尔值:
- ≥ 0:表示找到,返回对应元素在数组中的下标
- < 0:表示未找到,返回值为
-(insertion point) - 1,即负数取反减1就是应插入的位置(维持升序) - 例如在
[1, 3, 5, 7]中查 4,返回-3,说明应在索引 2 处插入(因为-(-3) - 1 = 2)
性能优势与适用边界
时间复杂度 O(log n),远优于线性查找的 O(n),但前提是:数组静态或变动极少。频繁增删后反复排序+查找,反而不如用 TreeSet 或 HashMap。
- 适合场景:一次性批量构建、后续只读查询(如配置项白名单、预加载字典)
- 不适合场景:动态变化的集合、小数组(n < 10 时线性查找可能更快)
- 注意:对
ArrayList等非数组结构,不能直接用此方法,需转成数组或改用其他查找方式

















