arrays.binarysearch的效率优势仅在已排序数组且多次查找时体现,它不排序、不校验顺序,返回索引或插入点编码(≥0表示找到),需配合arrays.sort使用,类型优选int[]避免装箱开销,极速本质是复用已排序数组。

Arrays.binarySearch 的效率优势只在“已排序数组 + 多次查找”场景下真正释放。它本身不排序、不校验顺序,只是一个纯二分逻辑执行器——快是快,但前提全靠你守。
排序是门槛,不是可选步骤
binarySearch 不做任何排序预检,传入乱序数组时,它仍会按二分流程硬算,返回值完全不可信。比如 {"Go","Java","Python"} 查 "Java",结果可能是 -2、0 或其他任意负数,毫无规律。
- 必须显式调用
Arrays.sort()(基本类型)或Arrays.sort(arr, comparator)(对象) - 对同一数组多次检索,排序只需一次;避免每次查找前都重排
- 数据库查出的工号列表,应在 DAO 层就加
ORDER BY emp_id ASC,而非在 Java 层补排序
返回值不是布尔标志,而是位置编码
它返回的是索引或插入点编码,不是 true/false。误用 index == -1 判断“未找到”,会漏掉所有应插在中间或末尾的情况。
- 正确判断方式只有:
if (index >= 0) { /* 找到了 */ } else { /* 没找到 */ } - 若需知道插入位置:用
-index - 1计算,例如返回 -7 → 插入点为 6 - 返回 ≥ 0 仅表示存在,不保证是第一个或最后一个重复项(有重复时结果不确定)
类型选择直接影响性能与安全性
工号、ID 类整型字段,优先用 int[] 而非 Integer[]:
-
int[]内存连续、无装箱开销、无 null 风险 -
Integer[]中混入 null 或用int值去查,容易触发NullPointerException - 若必须用包装类,key 也需显式构造:
Arrays.binarySearch(empIds, Integer.valueOf(1001))
极速的关键不在查找本身,而在数据复用
一次数据库查询 + 数组创建 + 排序,耗时远超百万次 binarySearch。所谓“极速”,本质是缓存升序数组,让查找变成纯 CPU 运算。
- 将
int[] empIdArray设为static final或单例持有 - 仅在工号变更时(如定时同步任务)更新数组,而非每次请求重建
- 并发更新需配合
volatile+ 双重检查锁,避免读到半初始化数组











