zoukankan      html  css  js  c++  java
  • 第四章 流程控制和数组

    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)将一个数组转化为字符串
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    KMP算法的理解和代码实现
    关于线程死锁
    PAT1018
    PAT1059
    PAT1009
    PAT1006
    PAT1005
    PAT1004
    PAT1002
    PAT
  • 原文地址:https://www.cnblogs.com/shipskunkun/p/4343627.html
Copyright © 2011-2022 走看看