发布于2026-07-10 阅读(0)
扫一扫,手机访问
Arrays.binarySearch() 的用法,很多人容易踩坑。这里把几个关键点梳理一下:首先,它只对已排序数组有效,未排序时结果不可预测;其次,返回值不是布尔型,要用 idx >= 0 判断存在;第三,基本类型与引用类型的重载不能混用;最后,性能优势体现在多次查找或大数量级场景。下面逐一展开。

Ja va 的 Arrays.binarySearch() 不会自动帮你排序——它默认数组已经是升序排列。如果数组没排过序,返回值既不是 -1 也不是正确索引,而是一个随机的负数(表示插入点),但你没法拿它来判断“是否存在”。实际开发中,最常见的错误就是忘了排序,结果折腾半天也定位不到原因。
使用前务必确认:要么数组初始化时就是有序的,要么显式调用 Arrays.sort()(注意基本类型和对象数组的重载区别)。
int[]、double[] 等基本类型数组,用 Arrays.sort(arr)String[] 或自定义对象数组,需确保元素实现了 Comparable,或传入 ComparatorArrays.binarySearch(arr, fromIndex, toIndex, key)很多人以为 binarySearch() 返回的是 true/false,其实它返回的是**索引值或负的插入点**。正数或 0 表示找到,对应元素下标;负数表示没找到,绝对值减 1 就是该元素应该插入的位置(保持升序)。常见错误:写成 if (binarySearch(...) != -1)——这会漏掉索引为 0 的情况。
正确判断是否存在应使用:
int idx = Arrays.binarySearch(arr, key); boolean found = idx >= 0;
若需插入位置(比如维护有序集合),可从负值还原:int insertPos = -(idx + 1)。
Ja va 为每种基本类型(int、long、double 等)和 Object 都提供了独立的重载。也就是说,Arrays.binarySearch(int[], int) 和 Arrays.binarySearch(Integer[], int) 完全是两码事——前者接受基本类型数组和基本类型 key,后者接受对象数组且 key 必须是 Integer。如果你传 int 给后者,会触发自动装箱,但若数组是 int[],就根本调不了那个重载。
int[] 就必须配 int key,不能传 IntegerInteger[] 就必须配 Integer key(或依赖自动装箱的 int),但注意 null 值会导致 NullPointerExceptionArrayList)不支持 binarySearch,得先转为数组或改用 Collections.binarySearch()单次查找时,binarySearch() 的 O(log n) 对比线性扫描 O(n) 的差距,在几百元素内几乎感觉不到;反而因为方法调用开销和边界检查,有时还稍慢。它的真正价值在于:当你需要在同一个已排序数组上执行**多次查找**(比如配置项查表、词典检索),或者数组本身很大(超过 10⁴ 个元素)且查找频繁时,才值得预排序加二分。
别为了“看起来高级”就提前优化。更常见的反模式是:每次插入一个新元素就重新排序再二分——这退化成了 O(n log n),远不如直接用 TreeSet 或 TreeMap。
边界情况容易被忽略:空数组返回 -1,单元素数组能正常工作,但若 key 类型与数组元素类型不一致(比如用 long 查 int[]),编译不通过;运行时若传了 null 给对象数组且没提供 Comparator,会抛 NullPointerException。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8