搜索的核心是理清“找什么、怎么比、找到就停、没找到怎么办”四步逻辑:线性搜索用for循环+if判断逐个比较并及时return;二分搜索在有序数组中通过while维护边界、计算mid、分情况收缩区间;变体搜索需分层处理条件,避免分支堆叠;调试需检查边界、循环终止和分支穷尽。

用 Java 的 if-else 和 for/while 实现搜索,关键不是背代码,而是理清“找什么、怎么比、找到就停、没找到怎么办”这四步逻辑。下面从最基础的线性搜索开始,逐步带出常见陷阱和优化思路。
线性搜索:先跑通最直白的思路
给定一个整数数组,查找某个目标值是否存在,返回它的下标(找不到返回 -1)。这是分支+循环最直接的组合:
- 用 for 循环逐个访问数组每个元素
- 每次用 if 判断当前元素是否等于目标值
- 一旦相等,立刻 return 下标——别继续往后查了
- 循环结束还没 return,说明全程没匹配,return -1
注意:return 不是可选操作,是提前退出的关键。很多人写成“设 flag = true”,最后再判断,反而绕远且易错。
二分搜索:分支逻辑变复杂,但循环结构不变
数组已升序排列时,可以用二分法加速。核心变化在“怎么比”和“怎么跳”:
- 不用遍历全部,每次比较中间元素,决定去左半边还是右半边
- 用 while 循环,维护 left 和 right 两个边界索引
- 每次计算 mid = left + (right - left) / 2(防整型溢出)
- if (arr[mid] == target) → 找到,return mid
- else if (arr[mid]
- else → 目标在左,right = mid - 1
- while 结束(left > right)还没找到,return -1
重点:else if 的顺序不能乱,mid 的更新必须严格对应区间收缩,否则死循环或越界。
搜索带条件的变体:分支嵌套要分层,别堆在一起
比如“找第一个大于 target 的元素下标”。这时 if 判断不再是简单相等,而是大小关系,并且要区分“找到了”和“还要继续找更靠前的”:
- 仍可用 for 循环从头扫,但判断逻辑变成:if (arr[i] > target),就记录 i 并 break
- 若要求“第一个”,那找到就停;若要求“最后一个”,就得扫完再返回最后一次满足的位置
- 用二分写这个变体时,else 部分不再简单收缩,而是根据意图调整:找左边界时,相等也往左缩;找右边界时,相等往右缩
建议:先把“找不找得到”的主干循环写好,再一层层加条件判断,避免把比较、赋值、边界更新全挤在一个 if 里。
调试搜索逻辑的三个检查点
写完别急着运行,先快速过三关:
- 边界是否覆盖:空数组、单元素、目标在首/尾、目标不存在——都试一遍
- 循环是否终止:for 的 i++ 有没有漏;while 的 left/right 更新后会不会卡住不动
- 分支是否穷尽:if-else 是否覆盖所有可能(比如只写 if 和 else if,忘了 else)
很多 bug 不是语法错,是逻辑漏了一种情况。养成手动走一遍小例子的习惯,比立刻看报错更高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











