arrays.binarysearch用于已排序数组的二分查找,要求升序排列,否则结果不可靠;返回≥0为索引,<0为-(插入点)-1;支持基本类型、对象数组、指定范围及自定义比较器。

Arrays.binarySearch 是 Java 提供的便捷工具方法,用于在**已排序的数组**中执行二分查找。它不改变原数组,只返回目标元素的索引(找到时),或一个负数(未找到时),关键前提是:数组必须升序排列,否则结果不可靠。
必须先排序,否则结果无意义
二分查找依赖有序性。如果数组没排过序,binarySearch 可能返回错误索引或负值,且这个负值不代表“离目标最近的位置”,只是算法中途退出的编码结果。
- 对原始数组排序:用
Arrays.sort(arr)(适用于基本类型和 Comparable 类型) - 若原数组不能修改,可复制后排序:
int[] copy = arr.clone(); Arrays.sort(copy); - 注意:字符串数组、包装类(如 Integer[])也适用,但需确保元素非 null(否则抛 NullPointerException)
返回值含义要准确理解
返回值不是简单的“-1 表示没找到”。它有明确语义:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- ≥ 0:表示目标元素在数组中的索引位置
- < 0:表示未找到,其值为
-(插入点) - 1,其中“插入点”是目标应插入的位置(保持升序),即第一个 ≥ 目标的元素下标;若所有元素都小于目标,插入点等于数组长度 - 例如在
[1,3,5,7]中查4:插入点是 2(因为 5 在索引 2),返回-3;查0:插入点是 0,返回-1;查9:插入点是 4,返回-5
支持多种类型和重载形式
除了最常用的 int[]、String[] 等,还提供:
- 指定范围查找:
binarySearch(int[] a, int fromIndex, int toIndex, int key),左闭右开区间,避免全数组扫描 - 对象数组 + 自定义比较器:
binarySearch(T[] a, T key, Comparator super T> c),适用于无法实现 Comparable 或需多规则排序的场景 - 泛型数组(T[])要求元素类型一致,且比较器或元素自身支持比较逻辑
常见误用与注意事项
实际使用中容易踩坑:
- 对
double[]或float[]查找时,浮点精度可能导致预期外的“未找到”,建议用Double.doubleToLongBits()比较或改用 BigDecimal - 基本类型数组(如
int[])不能传入null,否则直接抛NullPointerException - 数组为
null时同样抛空指针异常,调用前建议判空 - 不要把返回的负值直接取绝对值当作“最近位置”,它只反映插入逻辑,不等价于距离最小的索引
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










