第4章 流程控制与数组
4.1 循序结构
- 循序结构:程序从上到下逐行执行,中间没有任何判断和跳转。
4.2 分支结构
if语句和switch语句
4.2.1 if条件语句
if ( xx ){
xxx;
}
if ( xx ){
xxx;
}else{
xx;
}
if ( xx ){
xxx;
}else if ( xxx ){
xx;
}
- 花括号括起来的多行代码称为代码块,也称为条件执行体。
- 代码块,以分号结束的一行语句,空语句,都可以为条件执行体。
- else的含义是“否则”,else的隐含条件是对前面条件的取反。
- 使用if…else语句时,一定要先处理包含范围更小的情况。
4.2.2 switch分支语句
switch ( expressiion ){
case condition1:{
statement(s)
break;
}
case condition2:{
statement(s)
break;
}
...
default:{
statement(s)
}
}
- switch语句后的expression表达式的数据类型只能是byte,short,char,int四种整数类型,String,枚举类型。
- 如果省略了case后代码块的break;,将引入一个陷阱。
4.3 循环结构
循环语句包括:初始化语句,循环条件,循环体,迭代语句。
4.3.1 while循环语句
[init_statement]
while (test_expression){
statement;
[inreation_statement]
}
4.3.2 do while 循环语句
do while循环的循环体至少执行一次,循环条件后面必须有一个分号。
[init_statement]
do{
statement;
[inreation_statement]
}while (test_expression);
4.3.3 for 循环
for ([init_statement]; [test_expression]; [iteration_statement]){
statement
}
- 循环条件总比循环体要多执行一次。
- for循环的循环迭代语句没有与循环体放在一起,不管是否使用continue语句来结束本次循环,循环迭代语句一样会获得执行。
- 建议不要在循环体内修改循环变量,建议重新定义一个临时变量。
- for循环圆括号中只有两个分号是必需的,其他都是可以省略的。
- 如果要在for循环以外的地方使用初始化语句的值,可以额外定义一个变量来保存这个循环变量的值。
4.3.4 嵌套循环
把一个循环放进另一个循环的循环体,可以多层循环嵌套。
4.4 控制循环结构
4.4.1 使用break结束循环
- break可以在某种条件出现时强行终止循环,跳出循环体,开始执行循环之后的代码。
- 还可以直接结束外层循环,导致结束outer标签指定的循环。必须是一个有效的标签(在break语句所在的循环之前定义,或在其所在循环的外层循环之前定义)
outer :
for(...){
for(...){
...
break outer;
}
}
4.4.2 使用continue忽略本次循环剩下语句
- continue只是忽略本次循环剩下语句,接着开始下一次循环,并不会终止循环。
- 也可以使用标签(有效标签),continue outer语句就结束了外层循环的当次循环,直接开始下一次循环,内层循环没有机会执行完成。
outer :
for(...){
for(...){
...
continue outer;
}
}
4.4.3 使用return结束方法
return不是专门结束循环的,是结束一个方法的。
4.5 数组类型
4.5.1 理解数组:数组也是一种类型
- Java的数组要求所有的数组元素具有相同的数据类型。
- 一旦数组的初始化完成,数组在内存中所占空间将被固定下来,数组的长度不可变。
- java的数组可以存储基本类型数据,也可以存储引用类型数据。它本身是引用类型。
- 定义数组:定义一个变量时,仅仅定义了一个引用变量(一个指针),只有对数组进行初始化之后才可以使用。
- 定义数组时不能指定数组的长度。
- 数组的初始化:静态、动态初始化。
int[] intArr;//定义一个int数组类型的变量,变量名为intArr
intArr = new int[]{5,6,8,20};//静态初始化,指定数组元素的初始值,由系统决定长度
Object[] books = new String[4];//动态初始化,只指定数组的长度,由系统分配初始值
- 不要同时使用静态初始化和动态初始化。
- 使用数组:数组索引是从0开始的,都提供一个length属性,访问数组的长度。
for (int i = 0; i < price.length; i++){ //遍历
System.out.println(prices[i]);
}
4.5.5 foreach循环
- foreach循环可以循环遍历数组和集合。
String[] books = {"疯狂","java","讲义"};
for (String b : books){//foreach自动迭代数组的每个元素
System.out.println(b);
}
- foreach中的循环变量相当于一个临时变量,一次赋值给这个临时变量,这个临时变量不识数组元素,只是保存了数组元素的值。(如果希望改变数组元素的值,则不能使用foreach循环)
- foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值。
4.6 深入数组
数组元素和数组变量在内存里是分开存放的。
4.6.1 内存中的数组
- 数组引用变量是一个局部变量时,它被存储在栈内存中。
- 数组对象被存储在堆内存中。
- 引用变量是访问真实对象的根本方式。
- 只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。为了让垃圾回收机制回收一个数组所占的空间,可以将该数组变量赋为null。
- 数组要看成两个部分:数组引用,引用变量;实际的数组对象,堆内存里运行,不法直接访问,只能通过数组引用变量来访问。
- 二维数组:实质上还是一维数组,只是其数组元素也是引用指向一维数组。
int[][] a;
a = new int[4][];
int [][] b = new int[3][4];
//使用静态初始化一个二维数组
String[][] str1 = new String[][]{new String[3], new String[]{"hello"}};
- 工具类Arrays:包含一些static修饰的方法可以直接操作数组。
Arrays.equals(a,a2);//两个数组相同,返回true
Arrays.sort(b);//对数组b进行排序
Arrays.toString(b);//将一个数组转化为一个字符串
- 如果程序中有多个类型相同的变量,且具有逻辑的整体性,则可以定义为一个数组。