程序控制结构

顺序控制

程序从上到下逐行地执行,中间没有任何判断和跳转。

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_数组

分支控制

if-else

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_02

switch(表达式数据类型应和case 后的常量类型一致,或者是可以自动转成可以相互比较的类型)(switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum[枚举],String))(case子句中的值必须是常量,而不能是变量)

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_数组_03


【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_04

switch 和 if 的比较

  1. 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可
    以使用,建议使用 swtich 语句。
  2. 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广
/**
 * @创建人 wdl
 * @创建时间 2024/8/27
 * @描述
 */


import java.util.Scanner;

public class SwitchExercise {

    //编写一个 main 方法
    public static void main(String[] args) {

        double score = 80.1;
        switch ((int) (score / 60)) {
            case 0:
                System.out.println("不合格");
                break;
            case 1:
                System.out.println("合格");
                break;
            default:
                System.out.println("输入有误");
        }





    Scanner myScanner = new Scanner(System.in);
    System.out.println("输入月份");
    int month = myScanner.nextInt();
    switch(month)

    {
        case 3:
        case 4:
        case 5:
            System.out.println("这是春季");
            break;
        case 6:
        case 7:
        case 8:
            System.out.println("这是夏季");
            break;
        case 9:
        case 10:
        case 11:
            System.out.println("这是秋季");
            break;
        case 1:
        case 2:
        case 12:
            System.out.println("这是冬季");
            break;
        default:
            System.out.println("你输入的月份不对(1-12)");
    }


}
}

循环控制

for

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_System_05


【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_06

while(先判断,再执行)

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_开发语言_07

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_08

do…while(先执行,再判断,一定会至少执行一次)(最后有一个分号 ;)

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_java_09

  1. do while 是关键字
  2. 也有循环四要素, 只是位置不一样
  3. 先执行,再判断,也就是说,一定会至少执行一次
  4. 最后有一个分号 ;

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_10

跳转控制语句

break(默认退出最近的循环体)

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_开发语言_11

continue(用于结束本次循环,继续执行下一次循环)

return

return 使用在方法,表示跳出所在的方法,在讲解方法的时候,会详细的介绍

数组、排序和查找

数组介绍(数组是多个相同类型数据的组合,可以有自动类型转换)

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型
即:数(数据)组(一组)就是一组数据

数组的使用

动态初始化(数组的初始化和数组元素的赋值操作分开进行

  • 先声明数组
    语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;
  • 创建数组
    语法: 数组名=new 数据类型[大小];
a=new int[10];

静态初始化(数组的初始化和数组元素的赋值操作同时进行)(int a[]=new int[]{2,5};等价于int a[]={2,5}😉

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_12


等价于:

int a[]=new int[]{2,5};

注意事项和细节

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
  3. 数组创建后,如果没有赋值,有默认值 int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
  4. 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
  5. 数组的下标是从 0 开始的。
  6. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如
    int [] arr=new int[5]; 则有效下标为 0-4
  7. 数组属引用类型,数组型数据是对象(object)
/**
 * @创建人 wdl
 * @创建时间 2024/8/27
 * @描述
 */


public class ArrayDetail {


    //编写一个 main 方法
    public static void main(String[] args) {
        //1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
        //int[] arr1 = {1, 2, 3, 60,"hello"};//String ->int
        double[] arr2 = {1.1, 2.2, 3.3, 60.6, 100};//int ->double


        //2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
        String[] arr3 = {"北京", "jack", "milan"};


        //3. 数组创建后,如果没有赋值,有默认值
        //int	0,short 0, byte 0, long 0,
        //float 0.0,double 0.0,char \u0000,
        //boolean false,String null
        //
        short[] arr4 = new short[3];
        System.out.println("=====数组 arr4=====");
        for (int i = 0; i < arr4.length; i++) {
            System.out.println(arr4[i]);
        }

        //6. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如
        //int [] arr=new int[5]; 则有效下标为 0-4
        //即数组的下标/索引 最小 0 最大 数组长度-1(4)
        int [] arr = new int[5];
        //System.out.println(arr[5]);//数组越界


    }
}

错误写法示例(int[] arr3 = new int[3]{1,2,3}//动静搞混;)

//错误的写法:
//		int[] arr1 = new int[];
//		int[5] arr2 = new int[5];
//		int[] arr3 = new int[3]{1,2,3}//动静搞混;

数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
    int n1 = 2; int n2 = n1;
  2. 数组在默认情况下是引用传递,赋的值是地址
    看一个案例,并分析数组赋值的内存图(重点, 难点. )。
    //代码 ArrayAssign.java
    int[] arr1 = {1,2,3};
    int[] arr2 = arr1;

数组拷贝

编写代码 实现数组拷贝(内容复制) ArrayCopy.java
将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组, 要求数据空间是独立的.

/**
 * @创建人 wdl
 * @创建时间 2024/8/27
 * @描述
 */
public class ArrayCopy {
    //编写一个 main 方法
    public static void main(String[] args) {
        //将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组,
        //要求数据空间是独立的.
        int[] arr1 = {10, 20, 30};
        
        //创建一个新的数组 arr2,开辟新的数据空间
        //大小 arr1.length;
        int[] arr2 = new int[arr1.length];
        
        //遍历 arr1 ,把每个元素拷贝到 arr2 对应的元素位置
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }


        //修改 arr2, 不会对 arr1 有影响. arr2[0] = 100;
        
        //输出 arr1
        System.out.println("====arr1 的元素====");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);//10,20,30
        }

        System.out.println("====arr2 的元素====");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);//
        }


    }
}

数组添加/扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java

  1. 原始数组使用静态分配 int[] arr = {1,2,3}
  2. 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4}
  1. 定义初始数组 int[] arr = {1,2,3}//下标 0-2
  2. 定义一个新的数组 int[] arrNew = new int[arr.length+1];
  3. 遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组
  4. 将 4 赋给 arrNew[arrNew.length - 1] = 4;把 4 赋给 arrNew 最后一个元素
  5. 让 arr 指向 arrNew ; arr = arrNew; 那么 原来 arr 数组就被销毁
  6. 创建一个 Scanner 可以接受用户输入
  7. 因为用户什么时候退出,不确定,老师使用 do-while + break 来控制

多维数组-二维数组(二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同)

动态初始化

行列确定
  1. 语法: 类型[][] 数组名=new 类型[大小][大小]
  2. 比如: int a[][]=new int[2][3]
  3. 使用演示
  4. 二维数组在内存的存在形式(!!画图)
列数不确定
//创建 二维数组,一个有 3 个一维数组,但是每个一维数组还没有开数据空间
int[][] arr = new int[3][];

静态初始化

定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}}
使用即可 [ 固定方式访问 ]
比如:

int[][] arr = {{1,1,1}, {8,8,9}, {100}};

解读

  1. 定义了一个二维数组 arr
  2. arr 有三个元素(每个元素都是一维数组)
  3. 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素

错误写法示例

//错误的情况 
//		String[][] arr4 = new String[][4];
//		String[4][3] arr5 = new String[][];
//		int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};

数组使用细节和注意事项

  1. 一维数组的声明方式有:
    int[] x 或者 int x[]
  2. 二维数组的声明方式有:
    int[][] y 或者 int[] y[] 或者 int y[][]
  3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][] 是一个二维数组
int map [][] = {{1,2},{3,4,5}}

由 map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组

课堂练习

数组的赋值

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_System_13

数组的初始化

A. String strs[] = { ‘a’, ‘b’, ‘c’ };
错误。‘a’ 是字符类型(char),而数组定义为 String[],类型不匹配。

B. String[] strs = {“a”, “b”, “c”};
正确。这里定义了一个包含3个字符串元素的 String 数组,元素分别是 “a”, “b”, “c”。

C. String[] strs = new String(“a” “b” “c”);
错误。new String() 只能接受一个字符串作为参数,这里给了多个,且没有分隔符。

D. String strs[] = new String[]{“a”, “b”, “c”};
正确。new String[] 是正确的数组初始化方式,等价于 B 选项。

E. String[] strs = new String[3]{“a”, “b”, “c”};
错误。定义数组大小 new String[3] 时,不允许同时进行初始化。正确的做法是先声明大小,再逐一赋值。

while

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_开发语言_14


【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_System_15

数组的引用传递

【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_一维数组_16


【零基础 快速学Java】韩顺平 零基础30天学会Java---程序控制结构、数组、排序和查找 (2024JavaReview)_System_17

随机生成10个整数(1 100的范围)保存到数组

import java.util.Random;

/**
 * @创建人 wdl
 * @创建时间 2024/8/29
 * @描述
 */
public class RandomTest {
    public static void main(String[] args) {
        int[] arr=new int[10];
        Random random = new Random();
        for(int i=0;i<10;i++){
            arr[i]=random.nextInt(100);
            System.out.println(arr[i]);
        }
    }
}