<p>Java中数组实现二分查找前必须有序且元素可比较,否则结果不可靠;需检查null和空数组;手动实现时应避免整数溢出,推荐mid = left + (right - left) / 2。</p>

Java 中数组实现二分查找前,必须确保数组已按升序(或降序)有序排列,且元素可比较。否则结果不可靠,甚至抛出异常或返回错误索引。
数组必须是有序的
二分查找依赖“中间元素能划分搜索区间”的逻辑,这只有在单调有序时才成立。无序数组直接调用会导致漏查或死循环。
- 升序是最常见前提,如 [1, 3, 5, 7, 9];若为降序,需调整比较逻辑(如把
>改为<) - 可在查找前用
Arrays.stream(arr).sorted().toArray()排序,但注意:这会生成新数组,原数组未变,且破坏原始索引关系 - 实际开发中,应由业务逻辑保证插入/构造时有序,而非每次查找前排序
元素类型支持比较操作
所有被查找元素必须能相互比较大小,即满足 Comparable 约束,或提供 Comparator。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 基本类型数组(
int[]、double[]等)天然支持数值比较,但注意:Java 的Arrays.binarySearch对基本类型有专用重载方法 - 引用类型(如
String[]、Integer[])要求元素实现Comparable,或传入自定义Comparator - 若元素为自定义类,未实现
Comparable且未传Comparator,运行时会抛ClassCastException
检查空数组和 null 引用
数组为空或为 null 时,二分查找无意义,应提前拦截。
立即学习“Java免费学习笔记(深入)”;
- 对
int[] arr:用arr == null || arr.length == 0判断 - 对泛型数组(如
String[]):同样检查arr == null,再检查长度;不需额外判空元素(除非业务要求) - Java 标准库的
Arrays.binarySearch在传入null时会直接抛NullPointerException,建议调用前主动校验
避免整数溢出计算中点
传统写法 mid = (left + right) / 2 在大索引下可能因 left + right 溢出导致负数索引。
- 安全写法:
mid = left + (right - left) / 2,等价且无溢出风险 - Java 9+ 的
Math.floorDiv或Math.addExact可辅助检测,但日常推荐前者 - 使用标准库时无需手动处理,但手写算法必须注意这点

















