第四章 流程控制和数组
4.4循环控制结构
break 循环不仅可以结束其所在的循环,还可以直接结束外层循环,此时需要在break后跟个标签,用于标识外层循环。
out:
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
System.out.print("i="+i+"j="+j);
if(j==2)
break out;
}
}
与break相似,continue也可以跟一个标签,用于直接结束标签标识循环的当次循环,重新开始下一次循环
out:
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
System.out.println("i="+i+"j="+j);
if(j==2)
continue out;
}
}
return直接结束整个方法,不管在多少层循环内
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
System.out.println("i="+i+"j="+j);
if(j==2)
return;
}
}
4.5数组类型
数组也是一种数据类型,本身是一种引用类型,如int[]是一种引用类型。
type[] arrayname;
定义一个引用类型,名字是arrayname
数组一种引用类型的变量,定义一个变量时,仅仅表示一个引用变量,指针,不能使用,没有指向有效的内存空间,必须初始化之后才能使用。所谓初始化,就是为数组元素分配内存空间,并为每个数组元素赋初始值
初始化两种方法:静态初始化,显式指定元素初始值
动态初始化:只指定长度,系统分配初始值
![](http://images0.cnblogs.com/blog2015/726096/201503/170948333766530.png)
动态初始化和静态初始化不要同时使用,不要即指定数组长度,也为每个元素赋初始值
foreach 语法:
for(type variableName :array|collection)
{
}
tpye数组元素或集合元素的类型,variable是形参
String[] books={"englis","math"};
for(String book :books)
{
System.out.print(book);
}
注意:只能使用foreach遍历数组,但是不能用foreach改变变量值,因为如下程序中,最终的books[0]的值没有改变,那是因为foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量不是数组元素,只是保存了数组元素的值,所以要希望改变数组元素的值,不能使用foreach循环
String[] books={"englis","math"};
for(String book :books)
{
book="water";
System.out.println(book);
}
System.out.println(books[0]);
4.6深入数组
实际的数组元素被存在堆内存中,而数组引用变量是一个引用类型的变量,被储存在栈内存中。
堆和栈
一个方法执行,每个方法都有自己的内存栈,这个方法定义的变量将会放到这块栈内存中,方法结束,该方法内存栈也被销毁。
创建一个对象,这个对象被保存到堆内存中,对象创建成本比较大,堆中的对象不会随方法的结束而销毁,即使方法结束,还可以被另一个引用变量所引用,只有当一个对象没有任何引用变量引用它是,系统的垃圾回收机制才会在合适的时候回收
为了让垃圾回收机制回收一个数组所占的内存空间,可以将数据变量赋为null,也就切断了数据引用变量和实际数组之间的引用关系
只要类型互相兼容,可以让一个数组变量指向另一个实际的数组,而不是数组长度可变的错觉
看如下代码:
![](http://images0.cnblogs.com/blog2015/726096/201503/170948597516821.png)
似乎b的长度从4变为3,实际不是这样的,是栈内存中的b指向了堆内存中a指向的地址
![](http://images0.cnblogs.com/blog2015/726096/201503/170950110018588.png)
分析这个代码的执行过程:
先在栈内存中定义一个数组变量 iArr
动态初始化,在堆内存中开辟5个,初始化值为0,让IArr指向这5个内存
最后在为每个数组元素依次赋值
![](http://images0.cnblogs.com/blog2015/726096/201503/170950347513178.png)
分析这个代码执行过程:
1,先在栈内存中创建了一个数组变量students
2,动态初始化,在堆内存中创建2个单位,person也是对象,所以初始化为null
3,在栈内存中建立一个变量zhang
4,在堆内存中一个person变量,赋值15,158
5,6,同3,4
7,堆内存中的students[0]指向堆内存中的person zhang对象
java中虽然支持多维数组,但是从底层上看,没有多维数组,数组变量其实是一个引用,数组的引用再次指向真实的内存
分析二维数据的执行过程:a[][],a数组当成一维数组来看,每个数组都指向一个引用类型。
??不太懂java中可以int[][][]扩展成三维数组嘛?回答不可以!
![](http://images0.cnblogs.com/blog2015/726096/201503/170950593604195.png)
操作array的一些工具类
主要:
1,搜索某个值在数组中出现的位置
int binarySearch[type []a,type key]
要求数组按序排列
2,type[]copyOf(type[]original,int newlengeh)把original数组复制成一个新数组
3,boolean equals(type[] a,type[]b)只有当两个数组长度和对应的元素一一相等
4,void fill(type[]a,type val)把a数组所有元素都赋值为val
5,将数组进行排序
void sort(type[]a)
6,String toString(type[]a)将一个数组转化为字符串