binarysearch找不到存在元素是因为数组未升序排列——它不排序也不检查有序性,结果未定义;查不到时返回负数表示插入点,如-4对应索引3;含重复元素时只返回任一匹配位置;int[]版无装箱开销,integer[]版遇null抛npe。

binarySearch 为什么找不到明明存在的元素
因为 Arrays.binarySearch 要求输入数组必须已升序排列,否则结果未定义——可能返回负数、错误索引,甚至碰巧对了但纯属偶然。
- 常见错误现象:
binarySearch([3,1,4,1,5], 4)返回-2或-3,不是2 - 使用场景:只适用于预排序数据(如配置项字典、时间戳索引表),不适用于每次临时查未排序列表
- 别指望它“自动排序再搜”——它不做任何排序,也不检查是否有序,性能优势全靠你保证前提
- 如果数据动态变化,先
Arrays.sort()再搜,但注意:sort()是 O(n log n),反复调用比线性扫描还慢
查不到时返回的负数到底什么意思
负数不是随机乱给的,它编码了插入点位置,方便你后续维护有序结构。
- 返回值
-(insertionPoint) - 1,比如返回-4,说明该元素应插入到索引3(因为-(3) - 1 = -4) - 这个插入点是按升序规则算出的最小合法位置,可用于
ArrayList.add(insertionPoint, x)保持有序 - 如果数组含重复元素,它只保证返回“某个匹配位置”,不保证是第一个或最后一个——要找左边界得自己写循环或用
Collections.binarySearch配合Comparator
泛型版本和原始类型版本行为一致吗
行为逻辑一致,但空值处理和类型约束差异很大,容易在 Integer[] 和 int[] 间踩坑。
在原版的基础上做了一下修正评论没有提交正文的问题特价商品的调用连接问题去掉了一个后门补了SQL注入补了一个过滤漏洞浮动价不能删除的问题不能够搜索问题收藏时放入购物车时出错点放入购物车弹出2个窗口修正主题添加问题商家注册页导航连接问题销售排行不能显示更多问题热点商品不能显示更多问题增加了服务器探测 增加了空间使用查看 增加了在线文件编辑增加了后台管理里两处全选功能更新说明:后台的部分功能已经改过前台
-
binarySearch(int[], 5):底层用基本类型比较,null值根本不可能出现;但传Integer[]时,若数组含null,运行时抛NullPointerException -
binarySearch(Object[], T key, Comparator)版本要求key和数组元素都能被Comparator安全比较,否则ClassCastException或空指针 - 性能上,
int[]版本无装箱开销,Integer[]在大量查找时 GC 压力明显更高
替代方案:什么时候不该用 binarySearch
当你的数据不满足“静态、有序、随机访问快”三个条件中的任意一个,它就不是最优解。
立即学习“Java免费学习笔记(深入)”;
- 数据来自数据库或网络流?别先捞进数组再排序搜索,用 SQL
WHERE或服务端过滤 - 数组很小(
length )?线性扫描 <code>for循环通常更快,分支预测友好,无排序成本 - 需要频繁增删?考虑
TreeSet或ConcurrentSkipListSet,它们把排序和查找封装在一起,但注意TreeSet不支持重复元素 - 多线程读多写少?
CopyOnWriteArrayList的indexOf是线性扫描,但比每次加锁 +binarySearch更轻量
二分法本身很干净,但它的前提像玻璃地板——看不见裂缝,踩上去才碎。最常被忽略的,是「谁负责维持有序」这件事,从来不是 binarySearch 的责任。










