Java基础知识总结(三):流程控制与经典算法实现
·
Java基础知识总结(三):流程控制与经典算法实现
流程控制是编程的基础能力,算法则是程序员解决问题的核心能力。
在 Java 面试中,
break、continue、递归、冒泡排序、二分查找等内容属于高频考点。本文通过代码示例,系统梳理 Java 流程控制语句和经典算法实现。
目录
- 流程控制概述
- break语句
- continue语句
- 递归思想
- 阶乘实现
- 斐波那契数列实现
- 数组基础
- 数组翻转
- 冒泡排序
- 二分查找
- 算法复杂度简介
- 常见面试题
- 总结
一、流程控制概述
程序运行过程中,并不是所有代码都按照从上到下顺序执行。
Java提供了三种流程控制结构:
顺序结构
选择结构
循环结构
例如:
if (score >= 60) {
System.out.println("及格");
}
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
其中:
- if 属于选择结构
- for 属于循环结构
二、break语句
什么是break
break用于:
立即结束当前循环。
示例1:结束循环
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break;
}
System.out.println(i);
}
输出:
1
2
3
4
执行过程:
i=1 输出
i=2 输出
i=3 输出
i=4 输出
i=5
满足条件
break结束循环
示例2:查找数据
int[] nums = {10,20,30,40,50};
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 30) {
System.out.println("找到");
break;
}
}
找到目标后直接退出循环。
避免无效遍历。
三、continue语句
什么是continue
continue用于:
结束本次循环,直接进入下一次循环。
示例
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}
输出:
1
2
4
5
执行过程:
i=1 输出
i=2 输出
i=3
continue
跳过本次循环
直接进入下一次
i=4 输出
i=5 输出
break和continue区别
| 关键字 | 作用 |
|---|---|
| break | 结束整个循环 |
| continue | 跳过本次循环 |
示例:
break
结果:
循环结束
continue
结果:
继续下一轮循环
四、递归思想
什么是递归
递归:
方法自己调用自己。
例如:
public void test() {
test();
}
这虽然是递归,但属于错误递归。
因为没有结束条件。
最终导致:
StackOverflowError
栈溢出异常。
递归必须满足两个条件
1、有结束条件
例如:
n == 1
2、不断逼近结束条件
例如:
n - 1
五、阶乘实现
什么是阶乘
例如:
5!
=
5×4×3×2×1
=
120
普通实现
public static int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
递归实现
分析:
5!
=
5 × 4!
4!
=
4 × 3!
因此:
public static int factorial(int n) {
if (n == 1) {
return 1;
}
return n * factorial(n - 1);
}
测试:
System.out.println(factorial(5));
输出:
120
递归执行过程
factorial(5)
↓
5 * factorial(4)
↓
5 * 4 * factorial(3)
↓
5 * 4 * 3 * factorial(2)
↓
5 * 4 * 3 * 2 * factorial(1)
↓
返回1
↓
逐层返回
六、斐波那契数列
什么是斐波那契数列
规律:
1
1
2
3
5
8
13
21
从第三项开始:
当前项
=
前两项之和
递归实现
数学公式:
f(n)
=
f(n-1)+f(n-2)
代码:
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
测试:
System.out.println(fib(7));
输出:
13
存在的问题
递归会产生大量重复计算。
例如:
fib(7)
需要计算
fib(6)
fib(5)
而fib(6)
又需要计算
fib(5)
造成性能浪费。
循环优化实现
public static int fib(int n) {
if (n <= 2) {
return 1;
}
int a = 1;
int b = 1;
for (int i = 3; i <= n; i++) {
int temp = a + b;
a = b;
b = temp;
}
return b;
}
效率远高于递归。
七、数组基础
数组用于存储多个相同类型的数据。
例如:
int[] nums = {1,2,3,4,5};
访问:
System.out.println(nums[0]);
输出:
1
数组长度:
nums.length
遍历:
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
八、数组翻转
需求
原数组:
1 2 3 4 5
翻转后:
5 4 3 2 1
实现思路
首尾交换。
1 ↔ 5
2 ↔ 4
中间不动。
代码实现
public static void reverse(int[] arr) {
int left = 0;
int right = arr.length - 1;
while (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
测试
int[] arr = {1,2,3,4,5};
reverse(arr);
System.out.println(Arrays.toString(arr));
输出:
[5, 4, 3, 2, 1]
九、冒泡排序
什么是冒泡排序
思想:
每次比较相邻元素,大的往后移动。
最终:
最大值
像气泡一样
浮到最后
排序过程
原数组:
5 3 8 2
第一轮:
3 5 8 2
3 5 8 2
3 5 2 8
最大值:
8
已经排好。
代码实现
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
测试
int[] arr = {5,3,8,2};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
输出:
[2,3,5,8]
十、二分查找
查找思想
适用于:
有序数组
例如:
1 3 5 7 9 11 13
查找:
7
普通查找:
1个一个找
时间复杂度:
O(n)
二分查找:
每次排除一半数据
时间复杂度:
O(log n)
实现步骤
第一步
找到中间位置
mid = (left + right) / 2
第二步
比较目标值
arr[mid]
第三步
缩小范围
继续查找。
代码实现
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
测试
int[] arr = {1,3,5,7,9};
System.out.println(binarySearch(arr, 7));
输出:
3
十一、算法复杂度简介
O(1)
常数时间
arr[0]
O(n)
线性时间
遍历数组
O(log n)
对数时间
二分查找
O(n²)
平方时间
冒泡排序
复杂度对比:
O(1)
↓
O(log n)
↓
O(n)
↓
O(n²)
性能越来越差。
十二、常见面试题
面试题1
break和continue区别?
答案:
break结束整个循环
continue结束本次循环
面试题2
递归必须满足什么条件?
答案:
必须有结束条件
必须不断逼近结束条件
面试题3
递归为什么容易栈溢出?
答案:
每次调用都会入栈
没有结束条件
栈空间耗尽
发生StackOverflowError
面试题4
冒泡排序时间复杂度是多少?
答案:
O(n²)
面试题5
二分查找适用于什么场景?
答案:
有序数组
面试题6
二分查找时间复杂度是多少?
答案:
O(log n)
总结
本文介绍了:
- break
- continue
- 递归思想
- 阶乘实现
- 斐波那契数列
- 数组翻转
- 冒泡排序
- 二分查找
- 时间复杂度
这些内容不仅是 Java 基础知识,也是面试中的高频考点。
掌握这些算法思想后,再学习:
- 快速排序
- 归并排序
- 动态规划
- 回溯算法
会更加容易理解。
更多推荐


所有评论(0)