控制结构和数组

大家好呀!我是小笙!前几天被培训班的老师考察基础,发现漏洞还是有很多的,我想进一步学习java基础,所以我跟着韩老师学Java,以下是我的笔记

控制结构

控制循环类型

  • 顺序控制:程序从上到下逐行地执行,中间没有跳转和任何判断

  • 分支控制:if - else 判断

    // 单分支
    if(条件表达式){ 
        执行语句;
    }
    // 双分支
    if(条件表达式){ 
        执行语句;
    }else{
        执行语句;
    }
    // 多分支
    if(条件表达式){ 
        执行语句;
    }else if(条件表达式){
        执行语句;
    }else{
        
    }
    
  • 嵌套分支:在一个分支结构中嵌套另一层分支结构(最好不要超过三层)

  • switch分支结构

    switch(表达式){ // 表达式有具体的值 
           case 常量 1:语句一; // 表达式代表一个具体值,常量1与该值进行比较,相同则运行语句一
                      break; // 退出switch循环,否则直接进行语句2的运行(无需比较常量2)
    
           case 常量2:语句二; // 表达式代表一个具体值,常量2与该值进行比较,相同则运行语句二
                      break; 
           ....
           default: 最后一个语句; // 当不等于所有常量,则默认执行default语句   
    }
    

    细节注意:

    1. 表达式的数据类型必须和常量的数据类型必须相同 或者 可以自动转换的数据类型(常量的数据类型范围要比表达式的数据类型大)
    2. 表达式中具体值和常量的数据类型只能是(byte,short,int,char,enum,String)中的其中一个
    3. default关键字是可选择的(不是强制要求添加)
  • for循环控制 && while循环控制 && do…while循环语句

    // 基本语法
    for(循环变量初始化;循环条件;循环变量的变化){
        循环操作(可以多条语句);
    }
    运行顺序: 循环变量初始化 --> [ 循环条件 --> 循环操作 --> 循环条件的变化 ]
       
    
    // 等价于while x
    循环变量初始化;
    while(循环条件){
        循环操作(可以多条语句);
        循环变量的变化;
    }
    
    // 等价于do...while  先执行后判断
    循环变量初始化;
    do{
        循环操作(可以多条语句);
        循环变量的变化;
    }
    while(循环条件);
    

中断控制流程语句

break语句

概念:用于退出当前循环

// 不带标签的语句
for(int i = 0;i < 10;i++){
    for(int j = 0;j < 10;j++){
        break; // 默认中断当下循环
    }
}

// 带有标签的语句(格式: 标签名自定义 + :)
label1:
    for(int i = 0;i < 10;i++){
        label2:
        for(int j = 0;j < 10;j++){
            break label1; // 中断标签1的循环
        }
    }

// switch 中断语句
switch(表达式){ // 表达式有具体的值 
       case 常量 1:语句一; // 表达式代表一个具体值,常量1与该值进行比较,相同则运行语句一
                  break; // 退出switch循环,否则直接进行语句2的运行(无需比较常量2)

       case 常量2:语句二; // 表达式代表一个具体值,常量2与该值进行比较,相同则运行语句二
                  break; 
       ....
       default: 最后一个语句; // 当不等于所有常量,则默认执行default语句   
}

continue语句

概念:结束本次循环,继续进行下一次循环

// 不带标签的语句
for(int i = 0;i < 10;i++){
    for(int j = 0;j < 10;j++){
        continue; // 默认结束本次循环,而非退出循环,注意和break的区别
    }
}

// 带有标签的语句(格式: 标签名自定义 + :)
label1:
    for(int i = 0;i < 10;i++){
        label2:
        for(int j = 0;j < 10;j++){
            continue label1; // 结束label1的本次循环,跳转到label标签匹配的循环首部
        }
    }
return语句

概念:表示跳出当前所在的方法,如果该方法是main主方法,则相当于结束程序

break 和 continue 必须使用在 loop 或者 switch中,而return可以用在方法的任何位置

相关面试题

本章考验的部分一般在算法题

在JAVA 中,如何跳出当前的多重嵌套循环?【基础】

答:在最外层循环前加label 标识,然后用break:label 方法即可跳出多重循环。

swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上? 【基础】

答:switch(expr)中,可以传递给switch 和case语句的参数应该是int、short、char 或者byte。long不能作用于swtich,String能作用于switch上(java7以后支持)

continue、break 和 return 的区别是什么?

  1. continue :指跳出当前的这一次循环,继续下一次循环。
  2. break :指跳出整个循环体,继续执行循环下面的语句。
  3. return : 用于跳出所在方法,结束该方法的运行。return 一般有两种用法:
    • return; :直接使用 return 结束方法执行,用于没有返回值函数的方法
    • return value; :return 一个特定值,用于有返回值函数的方法

数组

一维数组

数组是引用数据类型,可以存放多个同一类型的数据,引用数据类型有默认初始值

数组的创建

// 先声明后初始化
// 声明数组名
int[] a; // 定义数组数据类型 和 数组名
或者
int a[]; // 推荐使用上面的形式 简洁明了
// 初始化数组
a = new int[5];  // 5 指的是数组长度(a.length) 

// 声明 + 初始化
int[] b = new int[5]; // 5 指的是数组长度(a.length) 
// 通过下标/索引 [0,array.length)来访问数组值 如:a[1]指的是第二个数组 

// 静态初始化  存入数组值
int[] c = {2,3,4,5,6}; // 最后一个值后面的逗号可加可不加

image-20220113194543786

注意细节

  • 数组创建后有默认初始值

    数据类型byteshortcharintlongfloatdoublebooleanString
    初始值00\u0000000.00.0falsenull
  • 数组范围,我用开区间表示:【0,array.length)

值传递和引用传递的区别

image-20220113235032216

数组拷贝 != 数组赋值(引用传递)

// Arrays方法
int[] a = {1,2,3};
int[] b = Arrays.copyOf(a,a.length)
    
// 遍历赋值
int[] a = {1,2,3};
int[] b = new int[a.length];
for(int i = 0;i < a.length;i++){
    b
}

二维数组

数组的创建

// 先声明后初始化
// 声明方式
int[][] a;   int[] a[];  int a[][];  
int[] x,y[]; // x 是一维数组 y 是二维数组
// 初始化二维数组
a[n] new int[5];  //n 的取值范围 [0,5) ,表示的是某一行的一维数组元素

// 动态初始化
int[][] twoArray = new int[5][]; // 5个一维数组,每个一维数组元素可以不相同
int[][] twoArray = new int[5][5]; // 5*5的二维数组
 
twoArray.length; // 二维数组的行数(二维数组元素个数)
twoArray[n].length; // n 的取值范围 [0,twoArray.length) ,表示的是某一行的一维数组元素

// 静态初始化
// 每个二维数组的每行元素并不一定相等
int[][] a =  {{1,2},{3,4,5,6,},{1,2,3}};
for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < a[i].length; j++) {
        System.out.print("\t"+a[i][j]);
    }
    System.out.println();
}
	1	2
	3	4	5	6
	1	2	3

二维数组的内存图分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHfPdDR7-1642251909681)(C:/Users/Ushop/AppData/Roaming/Typora/typora-user-images/image-20220115201337926.png)]

易错题
在这里插入图片描述

相关面试题

请你解释什么是值传递和引用传递?

考察点:JAVA引用传递

答:值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象.

杨辉三角实现(二维数组习题)

final int N = 10;
int[][] array = new int[N][];
for (int i = 0; i < N; i++) {
    array[i] = new int[i+1];
    for (int j = 0; j <= i; j++) {
        if(j == 0 || j == i){
            array[i][j] = 1;
        }else{
            array[i][j] = array [i-1][j] + array[i-1][j-1];
        }
    }
}

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        System.out.print(array[i][j]+"  ");
    }
    System.out.println();
}
// 实现效果
1  
1  1  
1  2  1  
1  3  3  1  
1  4  6  4  1  
1  5  10  10  5  1  
1  6  15  20  15  6  1  
1  7  21  35  35  21  7  1  
1  8  28  56  70  56  28  8  1  
1  9  36  84  126  126  84  36  9  1  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al_tair

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值