arrays.binarysearch仅适用于已升序排序的一维数组,不支持arraylist等集合;若需使用,须先转为数组并确保排序,返回值≥0表示找到索引,负数表示插入位置编码。

Arrays.binarySearch 不能直接用于集合(如 ArrayList、HashSet 等),它只支持一维数组(array),且前提是该数组已升序排序。所谓“查找目标在集合中的位置”,实际要分清:你手头的是数组还是集合。
必须用数组,不是集合
Arrays.binarySearch 是 Arrays 工具类的方法,签名全是形如 binarySearch(int[] a, int key) 或 binarySearch(String[] a, String key) —— 参数类型明确限定为数组。如果你有一个 ArrayList 或 LinkedList:
- 不能直接传进去,会编译报错
- 想用 binarySearch,得先转成数组:
String[] arr = list.toArray(new String[0]);,再确保 arr 已排序 - HashSet、TreeSet 等更不行:HashSet 无序,TreeSet 虽有序但不支持按索引访问,binarySearch 无法工作
位置含义要读懂返回值
查到时返回的是数组下标(从 0 开始);查不到时返回的不是 -1,而是插入点编码:
- ≥ 0 → 找到了,值就是索引
- 负数 → 没找到,真实插入位置 = -返回值 - 1
- 例如返回 -4,说明该元素应插在索引 3 的位置(因为 -4 = -(3) - 1)
排序是硬前提,不是可选项
调用 binarySearch 前,数组必须已升序排列。它不会帮你排序,也不会检测是否有序:
- 乱序数组上调用,结果完全不可信(可能返回负数,也可能碰巧返回正数,但毫无意义)
- 若原始数据未排序,必须先
Arrays.sort(arr)(基本类型)或Arrays.sort(arr, comparator)(对象数组) - 注意:sort 会修改原数组;如需保留原顺序,应复制后再排序查找
重复元素只返回“某一个”索引
如果目标值在数组中出现多次,binarySearch 返回的是任意一个匹配位置,不保证是第一个或最后一个:
- 需要首/末次出现位置?得在返回索引附近线性扫描(比如向左走到边界或值变化处)
- 仅判断存在性?只需检查返回值 ≥ 0 即可,不用深究具体位置











