arrays.binarysearch 只在已升序数组上可靠工作;未排序、降序或含null(对象数组)时返回负数或错误索引属正常设计;返回值≥0为索引,

Arrays.binarySearch 找不到元素,绝大多数情况不是方法出错,而是调用前提没满足——它只在已升序排列的数组上才可靠工作。只要数组未排序、降序、或含 null(对象数组),返回负数或错误索引就完全正常,不是 bug,是设计使然。
确认数组是否真正升序排列
binarySearch 不检查顺序,也不排序,它直接按“左小右大”假设计算中点并舍弃一半区间。一旦顺序错,舍弃的可能就是目标所在段。
- 对 int[]、double[] 等基本类型数组,必须先调用 Arrays.sort(arr)
- 对 String[] 或自定义对象数组,需确保已用 Arrays.sort(arr) 或 Arrays.sort(arr, comparator) 排好序
- 验证方式:打印数组内容,或用
Arrays.stream(arr).sorted().equals(Arrays.stream(arr))(仅作调试,勿用于生产)
理解返回值的真正含义
返回负数 ≠ “元素不存在”,而是编码了插入位置。忽略这点容易误判结果。
- 若返回值 ≥ 0:找到,该值即为合法索引
- 若返回值 :未找到,插入点 = -(result + 1)(不是 -result)
- 例如返回 -4 → 插入点是 3;返回 -1 → 插入点是 0;返回 -7(数组长为 6)→ 插入点是 6,即末尾
注意数据类型与空值陷阱
不同数组类型行为差异明显,尤其在 null 处理上:
- int[]、double[] 等基本类型数组:不可能有 null,不涉及空指针
- Integer[]、String[] 等对象数组:若含 null 元素,且未传 Comparator,运行时抛 NullPointerException
- 使用 Comparator 版本时,key 和所有数组元素都必须能被该 Comparator 安全比较,否则可能 ClassCastException
避免常见误用场景
有些需求看似适合 binarySearch,实则违背前提,强行使用反而更慢或出错:
- 每次查找前都对临时数组调用 Arrays.sort():排序 O(n log n) 比线性扫描 O(n) 还贵
- 在动态变化的集合中反复查——应改用 TreeSet 或 TreeMap,它们自动维护有序
- 需要找重复元素的首次/末次出现位置:binarySearch 只保证返回“某一个”,得配合手动边界搜索
- 用降序数组却没传 Collections.reverseOrder():结果完全不可预测











