java二分查找要求数组已排序,arrays.binarysearch()是推荐方法,返回索引或插入点补码;手写需注意mid防溢出、闭区间循环及边界更新;找重复元素需分别改造左右边界逻辑。

Java 中使用二分查找找元素,前提是数组必须已排序(升序或降序),否则结果不可靠。Java 提供了现成方法,也支持手写实现,下面分情况说明。
用 Arrays.binarySearch() 快速查找
这是最常用、最推荐的方式,适用于基本类型数组和对象数组:
- 返回值:找到时返回元素的索引(≥0);没找到返回一个负数(表示插入点的补码,即
-(insertionPoint) - 1) - 对 int 数组:
int index = Arrays.binarySearch(arr, target); - 对 String 数组(需确保元素非 null):
int index = Arrays.binarySearch(strArr, "abc"); - 自定义对象数组需实现
Comparable,或传入Comparator
手写二分查找(升序数组)
适合学习原理或需要定制逻辑(如找左边界、重复元素的第一个位置等):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用两个指针
left和right控制搜索范围,每次比较中间元素arr[mid] - 若
arr[mid] == target,直接返回mid - 若
arr[mid] ,说明目标在右半边,更新 <code>left = mid + 1 - 若
arr[mid] > target,说明目标在左半边,更新right = mid - 1 - 循环结束未找到,返回 -1
注意边界与常见坑
手写时容易出错的地方:
-
mid计算用left + (right - left) / 2,避免left + right溢出 - 循环条件用
left (闭区间),不是 <code>;否则会漏掉单个元素的情况 - 更新
left和right时记得 ±1,否则可能死循环 - 数组为空或为 null 时需提前判空,否则抛
NullPointerException或ArrayIndexOutOfBoundsException
找重复元素的起始/结束位置
标准 binarySearch 只返回任意一个匹配索引。如需找第一个或最后一个出现位置,需改造:
- 找左边界:相等时不立即返回,继续向左缩
right = mid - 1,最后返回left - 找右边界:相等时继续向右缩
left = mid + 1,最后返回right - 建议封装成独立方法,避免混淆
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










