第四章:流程控制与数组
switch分支语句
–
switch语句有一个控制表达式和多个case标签组成,和if语句不通的是,switch语句后面的控制表达式只能是byte,short,char,int四种整数类型,现在也支持String类和枚举类型,但是不能是boolean。
switch (expression){
case condition1:{
statement(s)
break;
}
case condition2:{
statement(s)
break;
}
case condition3:{
statement(s)
break;
}
default:{
statement(s)
}
}
这种分支语句的执行,先对expression求值,再依次匹配condition,遇到匹配的值,即执行对应的执行体。
控制循环结构
Java提供continue,break来控制循环结构,除此之外,return也可以结束整个方法,同时也结束了整个循环。
使用break结束循环
break用于结束当成循环,跳出循环体
break不仅可以结束其所在的循环,还可以直接结束外层的循环,此时需要在break后面紧跟一个标签,这个标签用于标识外层循环。(break 默认结束当成循环)
Java的标签就是一个紧跟(:)的标识符,如下
public class Test {
public static void main(String[] args) {
outer:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
System.out.println("i的值为"+i+",j的值为"+j);//i的值为0,j的值为0
if (j == 1){ //i的值为0,j的值为1
break outer;
}
}
}
}
}
使用continue忽略本次循环体中剩下的语句,进行下一次循环
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println("i的值为"+i);
if (i == 1) {
continue;
}
System.out.println("aaaaaa");
}
}
}
i的值为0
aaaaaa
i的值为1
i的值为2
aaaaaa
与break一样,continue也可以通过使用标签,结束外层循环,进入下一轮循环,语法与上相同
数组类型
Java的数组要求所有的数组元素具有相同的数据类型。即一个数组只能存储一种数据类型的数据。
一旦数组的初始化完成,数组在内存中的空间将被固定下来,因此数组的长度不可以改变。即使把数组元素的数据清空,但它占用的空间依旧会被保留
定义数组
使用Type[] arrayName方式定义数组。
数组是一种引用变量,因此使用它定义一个变量,仅仅表示定义了一个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储元素。因此这个数组也不能被使用,只能对数组初始化后才可以被使用。(定义数组时没有指定数组长度)
数组的初始化
Java中数组必须先初始化才可以使用,所谓初始化就是为了数组的数组元素分配内存空间,并为每个数组元素赋值。
为每个数组元素分配内存空间,也就是为每个数组元素赋值了(内存空间存储的内容,空null也是一个值),只要为数组元素分配了内存空间,就为其赋值了,初始值的获得有两种形式,一种由系统自动分配,一种由程序员自行分配。
静态初始化:由程序员显示置顶每个数组元素的初始值,由系统决定数组长度。
arrayName = new type[] {elements1,elements2,elements3,elements4...}
简洁初始化(只有在定义数组的同时,初始化数组才可以使用简化的静态初始化
type[] arrayName = {elements1,elements2,elements3,elements4...}
动态初始化:动态初始化只需要指定数组的长度,由系统为每个元素指定初始化值。
arrayName = new type[length]
指定初始值时,系统按一下规则分配初始值:
- byte ,short,int,long型数组元素默认初始值是 0 。
- float ,double型数组元素的默认初始值是 0.0。
- char型数组元素的默认初始值时‘\u.000’
- boolean型数组元素的默认初始值值是false
- 数组类型时引用类型:null
使用for循环遍历数组
使用foreach循环遍历数组和集合元素时,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素。
foreach循环语法格式如下:
for(type varName : array | collection){
//varName 自动迭代访问每个元素
}
public class Test {
public static void main(String[] args) {
String[] books = {"aaa","bbb","ccc"};
for (String book:books) {
System.out.println(book);
}
}
}
foreach循环无需根据索引来遍历数组元素。foreach循环无需循环条件,无需循环迭代语句。在遍历数组时,如果希望改变数组元素值,不要使用foreach循环。
深入数组
数组是一种引用类型。数组元素和数组变量在内存中是分开存放的。
内存中的数组
数组引用变量知识一个引用,这个引用变量可以指向任何有效内存,只有当该引用指向有效内存后,才可以通过该数组变量来访问数组元素。
实际上数组对象存储在堆内存中,引用该数组对象的数组引用变量存放在栈内存中。(数组引用变量是访问堆内存中数组元素的根本方式)
(当一个方法运行时,每个方法都会创建一个属于自己的内存栈没在这个方法中定义的变量都会被放到这个栈中,随着执行的结束,这个内存栈也会自行销毁;创建对象时,这个对象将被保存到运行时数据区,一边反复利用(对象的创建成本较大),运行时数据区就是堆内存,对内存中的对象不会随着方法的结束而销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制会自动回收)