控制结构和数组

Posted Al_tair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制结构和数组相关的知识,希望对你有一定的参考价值。

大家好呀!我是小笙!前几天被培训班的老师考察基础,发现漏洞还是有很多的,我想进一步学习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; // 最后一个值后面的逗号可加可不加

注意细节

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

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

值传递和引用传递的区别

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

// 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

二维数组的内存图分析

易错题

相关面试题

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

考察点: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  

以上是关于控制结构和数组的主要内容,如果未能解决你的问题,请参考以下文章

流程控制和数组

流程控制与数组

C# 篇基础知识2——运算符类型转换流程控制枚举结构体和数组函数

流程控制与数组

第四章.流程控制与数组

流程控制