第四章 流程控制和数组

来源:互联网 发布:wingide linux 编辑:程序博客网 时间:2024/06/08 06:05
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

数组一种引用类型的变量,定义一个变量时,仅仅表示一个引用变量,指针,不能使用,没有指向有效的内存空间,必须初始化之后才能使用。所谓初始化,就是为数组元素分配内存空间,并为每个数组元素赋初始值


初始化两种方法:静态初始化,显式指定元素初始值
动态初始化:只指定长度,系统分配初始值



动态初始化和静态初始化不要同时使用,不要即指定数组长度,也为每个元素赋初始值

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,也就切断了数据引用变量和实际数组之间的引用关系


只要类型互相兼容,可以让一个数组变量指向另一个实际的数组,而不是数组长度可变的错觉

看如下代码:


似乎b的长度从4变为3,实际不是这样的,是栈内存中的b指向了堆内存中a指向的地址





分析这个代码的执行过程:

先在栈内存中定义一个数组变量 iArr
动态初始化,在堆内存中开辟5个,初始化值为0,让IArr指向这5个内存
最后在为每个数组元素依次赋值





分析这个代码执行过程:
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[][][]扩展成三维数组嘛?回答不可以!




操作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)将一个数组转化为字符串























0 0
原创粉丝点击