程序控制结构
顺序控制
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支控制
if-else
switch(表达式数据类型应和case 后的常量类型一致,或者是可以自动转成
可以相互比较的类型)(switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum[枚举],String)
)(case子句中的值必须是常量,而不能是变量)
switch 和 if 的比较
- 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可
以使用,建议使用 swtich 语句。 - 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广
循环控制
for
while(先判断,再执行)
do…while(先执行,再判断,一定会至少执行一次)(最后有一个分号 ;)
- do while 是关键字
- 也有循环四要素, 只是位置不一样
先执行,再判断,也就是说,一定会至少执行一次
最后有一个分号 ;
跳转控制语句
break(默认退出最近的循环体)
continue(用于结束本次循环,继续执行下一次循环)
return
return 使用在方法,表示跳出所在的方法,在讲解方法的时候,会详细的介绍
数组、排序和查找
数组介绍(数组是多个相同类型数据的组合,可以有自动类型转换)
数组可以存放多个同一类型的数据
。数组也是一种数据类型,是引用类型
。
即:数(数据)组(一组)就是一组数据
数组的使用
动态初始化(数组的初始化和数组元素的赋值操作分开进行
)
- 先声明数组
语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
- 创建数组
语法: 数组名=new 数据类型[大小];
静态初始化(数组的初始化和数组元素的赋值操作同时进行
)(int a[]=new int[]{2,5};等价于int a[]={2,5}😉
等价于:
注意事项和细节
-
数组是多个相同类型数据的组合
,实现对这些数据的统一管理 - 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是
不能混用
。 - 数组创建后,如果没有赋值,
有默认值 int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
- 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
- 数组的下标是从 0 开始的。
- 数组下标必须在指定范围内使用,否则报:下标越界异常,比如
int [] arr=new int[5]; 则有效下标为 0-4
- 数组属引用类型,数组型数据是对象(object)
错误写法示例(int[] arr3 = new int[3]{1,2,3}//动静搞混;)
数组赋值机制
- 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
int n1 = 2; int n2 = n1; 数组在默认情况下是引用传递,赋的值是地址
。
看一个案例,并分析数组赋值的内存图(重点, 难点. )。
//代码 ArrayAssign.java
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
数组拷贝
编写代码 实现数组拷贝(内容复制) ArrayCopy.java
将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组, 要求数据空间是独立的.
数组添加/扩容
要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
- 原始数组使用静态分配 int[] arr = {1,2,3}
- 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4}
- 定义初始数组 int[] arr = {1,2,3}//下标 0-2
- 定义一个新的数组 int[] arrNew = new int[arr.length+1];
- 遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组
- 将 4 赋给 arrNew[arrNew.length - 1] = 4;把 4 赋给 arrNew 最后一个元素
- 让 arr 指向 arrNew ; arr = arrNew; 那么 原来 arr 数组就被销毁
- 创建一个 Scanner 可以接受用户输入
- 因为用户什么时候退出,不确定,老师使用 do-while + break 来控制
多维数组-二维数组(二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同
)
动态初始化
行列确定
- 语法: 类型[][] 数组名=new 类型[大小][大小]
- 比如: int a[][]=new int[2][3]
- 使用演示
- 二维数组在内存的存在形式(!!画图)
列数不确定
静态初始化
定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}}
使用即可 [ 固定方式访问 ]
比如:
解读
- 定义了一个二维数组 arr
- arr 有三个元素(每个元素都是一维数组)
- 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素
错误写法示例
数组使用细节和注意事项
- 一维数组的声明方式有:
int[] x 或者 int x[] - 二维数组的声明方式有:
int[][] y 或者 int[] y[] 或者 int y[][] - 二维数组实际上是由多个一维数组组成的,它的各个一维数组的
长度可以相同,也可以不相同
。比如: map[][] 是一个二维数组
由 map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组
课堂练习
数组的赋值
数组的初始化
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
数组的引用传递
随机生成10个整数(1 100的范围)保存到数组