线性搜索适合小规模未排序数组,代码简洁、缓存友好;二分查找需数组有序,时间复杂度O(log n),效率显著提升;哈希预处理适用于频繁查询且不便排序的场景。

Java 数组实现高效搜索,关键不在“一味求快”,而在于“选对算法、用对场景”。小数据用线性搜索,简洁可靠;有序大数据才值得上二分查找;频繁查同一数组又不想排序?哈希预处理更合适。核心是匹配数据特征与算法前提。
线性搜索:小规模未排序数据的首选
适合几十到一两百个元素的数组,无需排序、不依赖顺序、代码几行搞定。遍历比对,找到即返下标,没找到返 -1。
- 基础版直接用 == 比较基本类型,安全简洁
- 泛型版用 Objects.equals() 处理 null 和引用类型,避免空指针
- 平均只需检查一半元素,现代 CPU 缓存友好,实测百万次调用常低于 12ms
- 插入/删除后无需重排,特别适合动态变化的小列表
二分查找:必须有序,但效率跃升明显
前提是数组已升序(或降序)排列。每次比较砍掉一半范围,时间复杂度从 O(n) 降到 O(log n)。1000 个元素最多比 10 次,而线性搜索平均要 500 次。
- 注意边界计算用 left + (right - left) / 2,防整型溢出
- 循环条件是 left ,别漏掉单元素区间
- 未排序数组强行用二分,结果不可预测——先排序再查,总开销可能反超线性搜索
- 重复元素存在时,返回任意一个匹配索引,不保证是第一个或最后一个
哈希预处理:查得多、改得少时的加速方案
如果同一个数组被反复搜索,且能接受额外空间,把数组转成 HashMap<值, 索引> 是最稳的 O(1) 查找路径。
立即学习“Java免费学习笔记(深入)”;
- 一次建表(O(n)),后续每次查询接近常数时间
- 自动处理重复值时只保留最后出现的索引;如需所有位置,改用 Map<Integer, List<Integer>>
- 内存敏感场景慎用,毕竟多存一份键值映射
- 不适用于基本类型数组直接映射,需包装为 Integer[] 或用 IntObjectHashMap 等专用结构
选型对照:三秒判断该用哪个
看三个问题:数组是否已排序?数据量大概多少?搜索操作频次高不高?
- 未排序 + 小于 100 元素 → 用线性搜索
- 已排序 + 元素超 200 个 → 优先二分查找
- 同一数组被查几十次以上,且允许建缓存 → 上 HashMap 预处理
- 既要查得快、又要支持增删 → 考虑 TreeSet 或 TreeMap,但注意它们本身带排序开销


















