Arrays.binarySearch仅适用于已排序数组,否则结果无意义;找到目标时返回非负索引,未找到时返回-(插入点+1);使用前须确保数组升序且比较器一致,否则需先调用Arrays.sort。

Arrays.binarySearch 只能在已排序的数组上正确工作,否则结果无意义。
前提条件:数组必须升序排列
二分查找依赖“中间元素能划分搜索区间”的逻辑,这要求数据有序。若数组未排序:
- 返回值不保证是目标索引,甚至可能找不到存在的元素
- 即使偶然返回正确位置,也不具备可复现性
- 对字符串、自定义对象等,还需确保使用的比较器与排序时一致
返回值的两种情况
方法返回一个整数,含义分两类:
- 找到目标:返回该元素在数组中的实际索引(≥ 0)
- 未找到:返回一个负值,计算公式为 -(插入点 + 1),其中“插入点”指目标应插入的位置(保持升序),即第一个大于等于目标的元素下标;若所有元素都小于目标,则插入点等于数组长度
例如,在数组 [1, 3, 5, 7] 中查找 4:插入点是 2(因为 5 是第一个 ≥ 4 的元素),返回 -3;查找 0:插入点是 0,返回 -1;查找 9:插入点是 4,返回 -5。
立即学习“Java免费学习笔记(深入)”;
使用前务必先排序
如果不确定数组是否有序,调用 binarySearch 前应显式排序:
- 基本类型数组:用 Arrays.sort(arr)
- 对象数组:用 Arrays.sort(arr, comparator),且 binarySearch 也需传入相同 comparator
- 注意:sort 会修改原数组,如需保留原始顺序,应复制后再排序
不是所有“查找”场景都适合 binarySearch
它只适用于随机访问快、且已排序或可预排序的场景:
- 频繁增删的集合(如 ArrayList 不断 add/remove)——维护有序成本高,不如用 TreeSet 或 HashMap
- 仅查找一次的小数组(如长度
- 未实现 Comparable 或未提供 Comparator 的自定义类——无法比较,binarySearch 会抛 ClassCastException










