Java基础知识总结(三):流程控制与经典算法实现

流程控制是编程的基础能力,算法则是程序员解决问题的核心能力。

在 Java 面试中,breakcontinue、递归、冒泡排序、二分查找等内容属于高频考点。

本文通过代码示例,系统梳理 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 基础知识,也是面试中的高频考点。

掌握这些算法思想后,再学习:

  • 快速排序
  • 归并排序
  • 动态规划
  • 回溯算法

会更加容易理解。

更多推荐