流程语句与数组知识

1—流程控制

java程序是按照代码出现的先后顺序执行的,通过流程控制语句可以有效组织代码执行顺序。

一:判断语句
  1. if
    –形式:

    if (boolean)
    {
        [code];
    }
    

    如果boolean为真,code代码块会执行。
    如果boolean为假,就直接跳过它控制的代码块。
    当if控制的语句只有一句时,可以不写大括号。

    if 语句的嵌套:

    if (boolean)
    {
        if (bool)
        {
            if (b){ System.out.println("nihao"); }
        }
    }
    

    仅当boolean bool b 全为真时,才会输出nihao。

  2. if else
    –形式:

    if (boolean)
    {
        [code1];
    }
    else
    {
        [code2];
    }
    

    如果boolean为真,执行code1代码块。
    如果boolean为假,执行code2代码块。
    同样,当if或else只控制一条语句时,可以不写大括号。

  3. if - else if
    –形式:

    if (boolean)
    {
        [code1];
    }
    else if (bool)
    {
        [code2];
    }
    

    boolean为真,执行code1代码块。然后跳过code2代码块。
    boolean为假,跳过code1,判断code2。

  4. 三个判断语句的区别
    if语句只是单纯的判断是否满足某一个条件。
    if-else则是两个条件之间的互斥选择,即两个互斥的条件只能选择其一。
    if-else可以看成 if (bool) - else (!bool)的简写。
    而bool和 !bool 组成的集合为1,这时候就是如果不是bool,肯定是 !bool 。
    if - else if 是在bool和!bool组成的集合不是1的情况下,这时候如果不是bool,也不一定是 !bool 。
    需要根据条件的性质选择适合的判断语句。

  5. switch
    可以进行有限遍历操作。
    –形式:

    switch (3)
    {
        case 1 : System.out.println(1);
            break;
        case 2 : System.out.println(2);
            break;
        case 3 : System.out.println(3);
            break;
        default : System.out.println("无");
    }
    

    switch 只适用于 int , byte , short , char 四种类型。
    代码块中会把表达式与每个case碰一碰比较是否相等,如果相等,就执行对应语句。
    如果匹配的case没有表明break跳出循环,程序会顺序往下面读,不判断case和default了,直到出现break或者程序执行完才结束。
    注意:switch中的default可以没有顺序,多个case的执行语句相同时也可以几个case合起来写。
    有限的匹配结果时,选择 switch 。

  6. 举例:多种方式输出星期几
    判断语句的使用条件。
    (1)//if - else if

    int x=3;
    if (x==1)
        System.out.println("星期一");
    else if (x==2)      //如果不用else if ,而是if,那么当上面判断语句是真时,此语句仍会被判断。
        System.out.println("星期二");
    else if (x==3)
        System.out.println("星期三");
    else if (x==4)
        System.out.println("星期四");
    else if (x==5)
        System.out.println("星期五");
    else if (x==6)
        System.out.println("星期六");
    else 
        System.out.println("星期天");
    

    (2)//switch

    int x=4;
    switch (x)
    {
        case 1:
            System.out.println("星期一");
            break;  //此处如果不写break跳出循环,那么当case1满足时,后面的所有case都会被忽略而直接执行可执行语句,出现混乱。
        case 2:
            System.out.println("星期二");
            break;
        case 3:
            System.out.println("星期三");
            break;
        case 4:
            System.out.println("星期四");
            break;
        case 5:
            System.out.println("星期五");
            break;
        case 6:
            System.out.println("星期六");
            break;
        default:    //当以上所有case都不符合条件是执行的语句。
            System.out.println("星期天");
            break;  //最后一个break最好写上,有时候case是缺少break语句的。
    }
    

    注意:如果对有限的数值判断时,可以用switch,注意switch只接收四种类型:byte,short,int,char。
    其他情况比如对区间判断和对布尔型判断,用 if 比较方便。

二:循环语句
  1. while
    –形式:

    while (boolean)
    {
        [code];
    }
    

    当boolean满足条件,code就可以执行。
    如果boolean一直为真,程序就会陷入死循环,一直执行code代码块,跳不出来。
    如:

    int sum=0;
    int x=0;
    while (x<10)
    {
        sum*=2;
        x++;
    }
    

    while 循环的判断条件的变量要在外部定义好。
    while语句中一般有变量自增或自减的语句,好让循环是有限的。
    如果判断条件一开始就不满足,while语句一次都不会执行,直接跳过。

    循环语句的嵌套:

    while (boolean)
    {
        while (bool){}
    }
    
  2. do while
    –形式:

    do
    {
        [code];
    }
    while(boolean);
    

    这种形式的循环是把代码块现在前面,循环条件写在后面。
    所以即使循环条件boolean不满足,代码块也会执行一次。
    do while 和 while 只是循环条件和代码块的执行顺序不一样。
    注意: while 语句后面要加分号。

    举例:随机产生大写字母,直到出现Z停止。

    import java.math.*;
    class Demo
    {
        public static void main(String [] args)
        {
            char c;
            do
            {
                c=(char)('A'+(int)(Math.random()*26))
                System.out.println(c+",");
            }
            while(c!='Z');
        }
    }
    
  3. for
    –形式:

    for (int x=0;x<10;x++)
    {
        [code]; 
    }
    

    for 执行时首先要执行初始化动作,就是 int x=0;
    然后判断循环终止条件, x<10;如果满足就可以执行code代码块。
    最后再执行迭代部分,x++。
    只要满足循环终止条件,代码块就会一直执行。
    注意:x 在这里是局部变量,循环已结束,变量就消失。
    * 变量x可以在外面定义。

    int x=0;
    for ( ;x<10;x++){}
    

    *最简单的无线for循环。

    for ( ; ; ){}
    

    这里默认的循环终止条件为true。
    *可以有多个变量。

    for (int x=0,y=10;x<y;x++,y--){}
    
  4. 举例:for循环嵌套打印99乘法表

    for (int y=1;y<10;y++)
    {
        for (int x=1;x<10;x++)
        {
            System.out.prin(x+"*"+y+"="+x*y+"   ");
        }
        System.out.println();
    }
    
  5. 输出数字阵列。语句嵌套运用
    1
    12
    123
    1234
    12345

    for (int x=1;x<6;x++)
    {
        for (int y=1;y<=x;y++)
        {
            System.out.println(y);
        }
    }
    
  6. for和while的区别
    for中的一般是局部变量,在for循环外无效。可以节省内存。
    while中的变量是外部定义好的。
    如果变量仅用于控制循环,在循环外部基本无用,就使用for循环。
    一般能用for循环的语句,也可以用while。

三:跳转语句
  1. break
    break语句可以跳出循环。
    break语句在拥有标签的嵌套循环中也可以标签化中断:

    out : for (int x=0;x<10;x++)
    {
        in : for (int y=1;y<5;y++)
        {
            if (x=3) break out; //可以根据循环的标签指定要跳出那个循环。
        }
    }
    
  2. continue
    结束本次循环并进入下一个循环。
    continue 也可以标签化继续。

  3. return
    return可以返回一个结果并结束该方法。
    单独写return是指从当前方法退出。
    return 可以标签后返回并退出。

    注意:
    这三个跳转语句的下面不能直接跟上一条语句,否则这条语句永远执行不到,在程序编译时会报错。

四:递归
  1. 递归的思想是“自己调用自己”。
    递归需要有递归头,即什么时候不再调用自身。
    如:调用一个方法method().求阶乘。

    public static int method(int x)
    {
        if (x==1)
            return 1;
        else
            return x*method(x-1);
    }
    

    注意:递归程序比较耗用内存,递归层次较多时比循环结构慢得多。

——————————————————————————————————————

2—数组

  • 写法
    int [] arr = new int [4]; //新生成一个数组,容量是4,都已经初始化为0。或者 int arr []形式。
    int [] arr = new int [] {1,2}; //静态数组,声明时已经赋值。
    int [] arr = {1,2,3,4,5}; //静态数组,最简形式。
    其他类型的数组同理,修改类型就可以。
    数组是三大引用类型之一,还有类和接口。
    数组中的常用方法:
    array.length 代表数组的长度。

  • 数组引用类型的特点

        int [] arr={1,2,3};
        arr=null;
        System.out.println(arr[0]);     
    

    栈中的数组变量arr重新指向一个空值,不再指向堆中的实体{1,2,3},打印arr[0] 会出错:空指针异常。
    数组有下标,arr[0]表示数组的第一个元素。
    但对于长度为n的数组,最大可以有arr[n-1],arr[n]会角标越界。

  • 堆和栈的特点
    堆中存放实体数据,实体数据都有默认值: int 初始为0,double初始为 0.0 ,float初始为 0.0f ,布尔初始为 false 。
    堆中的实体都有内存地址值,堆有一个特有的垃圾回收机制,不定时的清除内存中的垃圾。
    栈内存中数据使用完毕可以自动释放。局部变量都是在栈内存中。

  • 工具类的使用和说明文档的制作
    -对于别人写好的class文件形式的工具,我们可以set classpath=[dir]; 调用这个工具类。
    要想详细了解这个工具的使用方法,就需要有一个工具类的说明文档。
    介绍一下工具类的说明文档的制作:
    对于一个写好的java文件,需要用文档注释工具编译,形式如下:

      javadoc    -d    c:\pack  -author -version  Tool.java
      -------------------------------------------------------
    //编译工具 + 目录为 + 具体路径 + 作者  +   版本  +  java文件 
    //作者和版本可以不写。
    

    注意:
    需要生成注释文档的类必须是public修饰的,否则权限不足以公开。
    javadoc 只会提取文件中public或者protected修饰的方法上的/* /中的内容,提取出来的文档也是以网页形式存储的。
    如果不需要该类创建对象,可以不用public修饰类中的构造函数,就不会创建对象。

  • 数组的排序与获取最值的工具类

    /**
    这是一个对数组操作的工具类。可以实现数组的求最值,排序,打印的功能。
    @author 自己  
    @version V1.1.12
    */
    public class Tool
    {
        private Tool(){}    //将构造函数私有化,外界没有权限创建对象,针对创建对象没有意义的情况。
    
        /**获取一个整型数组中的最大值。
        @param arr 接收一个int类型的数组。
        @return 返回数组的最大值。
        */
        public static int getMax(int [] arr)
        {
            int max=arr[0];
            for (int x=1;x<arr.length;x++)
            {
                if (max<arr[x])
                    max=arr[x];
            }
            return max;
        }
    
        /**获取一个整型数组的最小值。
        @param arr 接收一个int类型的数组。
        @return 返回数组的最小值。
        */
        public static int getMin(int [] arr)
        {
            int min=0;
            for (int x=1;x<arr.length;x++)
            {
                if (arr[min]>arr[x])
                    min=x;
            }
            return arr[min];
        }
    
        /**给整型数组选择排序。
        @param arr 接收一个int类型数组。
        */
        public static void selectSort(int [] arr)
        {
            for (int x=0;x<arr.length-1;x++)
            {
                for (int y=x+1;y<arr.length;y++)
                {
                    if (arr[x]>arr[y])
                        swap(arr,x,y);
                }
            }
        }
    
        /**给整型数组冒泡排序。
        @param arr 接收一个int类型数组。
        */
        public static void bubbleSort(int [] arr)
        {
            for (int x=arr.length-1;x>0;x--)
            {
                for (int y=0;y<x;y++)
                {
                    if (arr[y]>arr[y+1])
                        swap(arr,y,y+1);
                }
            }
        }
    
        /**对数组元素进行置换操作。
        @param arr 要接收的int型数组。
        @param a 要置换的元素角标。
        @param b 要置换的元素角标。
        */
        private static void swap(int [] arr,int a,int b)
        {
            int t=arr[a];
            arr[a]=arr[b];
            arr[b]=t;
        }
    
        /**数组遍历输出。
        @param arr 接收一个int型数组。
        */
        public static void printArray(int [] arr)
        {
            System.out.print("[");
            for (int x=0;x<arr.length;x++)
            {
                if (x==arr.length-1)
                    System.out.print(arr[x]+"]");
                else
                    System.out.print(arr[x]+",");
            }
        }
    }
    
  • 小知识点:java调用包的排序

    import java.util.*;
    class ArrayDemo
    {
        public static void main(String [] args)
        {
            int [] arr={8,1,2,4,3,7,2,5,0,9,6};
            printArray(arr);
            Arrays.sort(arr);       //调用包Arrays直接自然排序。
            printArray(arr);
        }
        public static void printArray(int [] arr)
        {
            System.out.print("[");
            for (int x=0;x<arr.length;x++)
            {
                if (x==arr.length-1)
                    System.out.print(arr[x]+"]");
                else
                    System.out.print(arr[x]+",");
            }
        }
    }
    
  • 数组元素查找
    遍历数组元素,判断与要查找的数是否相同。找到了就直接return角标位,没找到就return -1.
    如果数组比较长,效率比较低,可以选择折半查找的方式。
    注意:折半查找首先要求数组有顺序。

    //在有序数组中折半查找一个元素。

    public static int halfSearch(int [] arr,int key)
    {
        int min=0,max=arr.length-1; //定义最值。
        while (min<=max)
        {
            int mid=(min+max)/2;    //定义中间值。
            if (arr[mid]==key)      //等于key可以直接结束。
                return mid;
            else
            {
                if (arr[mid]<key)   //小于key说明key在arr[mid]右边。
                    min=mid+1;
                else                //这里arr[mid]肯定大于key,说明arr[mid]在左边。
                    max=mid-1;
            }
        }
        return -1;
    }
    
  • 数组元素插入
    插入一个元素也要求数组有序。
    遍历数组元素与key比较,当第一次key大于数组中的某个元素时,这个元素的角标就是插入位。
    当数组比较长时,效率就比较低,可以选择折半插入的方式。

    //在有序数组中折半插入一个元素。

    public static int halfInsert(int [] arr,int key)
    {
        int min=0,max=arr.length-1;
        if (arr[max]<key)
            return -1;
        while (min<=max)
        {
            int mid=(min+max)/2;
    
            if (arr[min]>=key)
                return min;
            if (arr[max]<=key)
                return max+1;
            if (arr[mid]==key)
                return mid;
            if (arr[mid]>key)
                max=mid-1;
            if (arr[mid]<key)
                min=mid+1;
    
        }
    }
    
  • 二维数组

    int [] [] arr=new int [3] [4]; 定义一个包含3个一维数组的二维数组,每个一维数组包含四个元素。
    一维数组的长度可以不指定,但二维数组的长度必须指定。
    二维数组的另一种写法: int [] [] arr={{},{},{}};
    如果写成 int [] x,y []; 就相当于: int [] x; int [] y []; x是一维数组,y是二维数组。
    arr [2] [3]=2; 对第二个一维数组的第三个元素赋值为2.
    System.out.println(arr) 打印的是二维数组的地址值。
    System.out.println(arr[1]); 打印的是一维数组的内存地址值。
    System.out.println(arr[0] [0]); 如果一维数组元素初始化了,打印的就是0,否则打印null。
    注意:给数组分配长度,就会使数组初始化。

  • 二维数组元素求和

    public static void getSum()
    {
        int [] [] erarr={{8,12,6,10,7},{8,6,4,12,7},{6,4,11,8,5},{9,5,11,8,13}};
        int sum=0;
        for (int x=0;x<erarr.length;x++)
        {
            for (int y=0;y<erarr[x].length;y++)
            {
                sum=sum+erarr[x][y];
            }
        }
        System.out.println(sum);
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值