美文网首页
Java - Part 2

Java - Part 2

作者: 低调的灬攻城狮 | 来源:发表于2020-02-25 22:08 被阅读0次

    一、循环语句

    循环语句满足一定条件循环执行循环体内的语句。
    循环语句在Java中有三种形式:for,while,do...while。
    1.for循环

    • for循环语句的格式为:for(初始化表达式;condition;循环后表达式){statement}。执行流程是:首先执行初始化表达式,将变量初始化,然后判断条件,如果条件满足,也就是true就执行循环体中的语句,执行完之后执行循环后表达式,再次判断,如果条件不满足,也就是false会退出循环。
    • for循环中的三个部分均可以省略,初始化表达式不是必须,因为可以在外面进行变量的初始化,condition也不是必须,如果省略的话默认为true,无限循环,循环后表达式也可以省略,因为可以在循环体内对循环判断变量进行计算,这样就相当于一个while循环了。如果同时省略三条语句的话就相当于一个while(true)循环了。

    2.while循环
    while循环语句的格式为while(condition){循环语句}。while循环的执行流程为首先判断condition是否为true,如果为true,就执行循环体内的语句,否则就退出循环。一般将while循环看作是for循环的简写形式,因为while循环能做的for循环一定能做,while循环适用于循环次数不确定的情况下,比如当一个方法返回boolean类型的时候,可以用这个方法作为condition,如果返回true就执行循环体内的语句。

    3.do{}while()循环
    do...while循环语句的格式为do{循环语句}while(condition)。执行流程是,先执行一遍循环体内的语句,然后再进行判断,如果为true继续执行循环,否则,退出循环。do...while循环与while循环的不同是:do...while循环至少会执行一次循环体内的语句,while循环有可能一次也不执行。

    4.关键字
    return:return关键字是和方法一起作用的,return后面的语句不再执行,结束整个方法,整个方法结束了,循环语句也就结束了。
    break:break关键字的作用是结束循环,循环后如果还有语句还会继续执行,如果有多层循环的话break只能结束所在的那层循环。
    continue:结束本次循环,不再执行循环内continue后面的语句,开始下一次循环。
    如果break和continue想要结束父循环,就必须给父循环起别名。

    二、数组

    • 数组是存放同一种数据类型的容器,定义时就必须指定长度与数据类型,通过下标访问,长度不能改变。Java中唯一的底层容器就是数组,是一种引用数据类型。

    1.数组的初始化

    • 静态初始化:在定义数组时数组中的元素由程序员自己指定,数组的长度由Java虚拟机自己判断,这种方式不够灵活。
    • 动态初始化:定义数组时不指定内容,只指定长度,数组中的元素由JVM自己填充。
      2.数组的操作
    • 获取数组的元素:使用下标值:arr[i],数组中的元素下标是从0开始的,所以要想获取第i个元素,就需要使用ar[i-1]。
    • 获取数组的长度:arr.length。数组中最后一个元素的获取方式:arr[arr.length-1]。
    • 数组中存储的是元素的地址而不是值。

    3.数组的默认值

    • byte、short、int、long默认初始化值是0。
    • float与double的默认初始化值是0.0。
    • char默认初始化值是十六进制的'\u0000'。
    • boolean类型的默认初始化值是false。
    • 引用数据类型的默认初始化值是null。
    1. 数组在内存中的分配
      Java在内存中只有两个部分:堆区与栈区,很多人在这两个部分基础上再分出方法区、常量池等部分,引用数据类型都是存储在堆区,栈区只存储局部变量。数组的初始化是这样的过程:首先分配连续的内存空间,然后分配下标,之后如果是动态初始化就分配默认的值,如果是静态初始化就赋上指定的值。

    5.数组中常见的问题
    ArrayIndexOutOfBoundException:下标越界异常。
    NullPointerException:空指针异常。

    6.数组的基本操作

    遍历数组
    for(int i=0;i<arr.length;i++){
        System.out.println(arr[i]);
    }
    获取数组中的最大值/最小值
    int max = arr[0]
    for(int i=1;i<arr.length;i++){
        if(arr[i]>max){
            max = arr[i];
        }
    }
    反转数组
    for(int i=0;i<arr.length/2;i++){
        int temp = arr[i];
        arr[i] = arr[arr.length-1-i];
        arr[arr.length-1-i] = temp;
    }
    查找数组中某个值第一次出现的位置,如果没找到,就打印-1
    int value;
    int index = -1;
    for(int i=0;i<arr.length;i++){
        if(arr[i]==value){
            index = i;
            break;
        }
    }
    System.out.println(index);
    

    7.二分查找
    二分查找是效率最高的查找算法,最坏时间复杂度是log(N)。一次可以将一半的数据剔除,但是二分查找的前提是已经排序好的数据。

    public static int binarySearch(int[] arr,int value){
        int bottom = 0;
        int top = arr.length-1;
        int index = -1;
        while(bottom<=top){
            int mid = (bottom+top)/2;
            if(arr[mid]==value){
                index = mid;
                break;
            }
            else if(arr[mid]<value){
                bottom = mid+1;
            }
            else {
                top = mid-1;
            }
        }
        return index;
    }
    

    8.冒泡排序
    冒泡排序算法是较为简单的排序算法之一,其基本思想是比较相邻的两个元素,依次将最大的数放在最后面,这样就实现了元素从小到大排序。这个排序算法的时间复杂度是O(n2)。

    public static void bubbleSort(int[] a){
        for(int i=0;i<a.length-1;i++){
            for(int j=0;j<a.length-1-i;j++>){
                if(a[j]>a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
    }
    

    三、方法

    • 方法:用来包裹一段代码,这样这段代码就实现了重用,不然每次都需要重新写一遍方法中的代码。
    • 定义一个方法的格式如下:
      权限修饰符 静态/非静态 返回值类型 方法名(参数类型1 参数1,参数类型2 参数2,.....)。
    • 权限修饰符:public private protected 或者没有。
    • 静态/非静态:static 如果有static就是静态,没有static就是非静态。
    • 返回值类型:可以有返回值类型,也可以没有返回值(void)。
    • 方法名:遵循驼峰命名法。
    • 参数:数量无限制,但一般不要超过四个,否则不容易记忆,也可以没有。

    1.方法的分类和调用

    • 方法的分类:根据有无参数及有无返回值可以分为四类:有参方法、无参方法、有返回值与无返回值。
    • 调用方式:单独调用、输出调用、赋值调用。

    2.方法的重载(OVERLOADING)
    JVM判断两个方法是否相同依据方法名与参数列表,如果两者都相同,则认定是同一个方法,一个类中不允许出现方法名相同,参数列表也相同的两个方法,两者只要有一个不同就是不同的方法。方法的重载含义是在同一个类中出现了多个方法名相同,但是参数列表不相同的方法,参数列表包括参数类型、参数个数、参数顺序,只要有一个不同就算是重载。但是参数顺序不同的重载在程序开发中没有意义,所以不要使用。

    3.方法间相互调用
    JVM在调用某个方法时,会将这个方法压入栈中,如果这个方法又调用了其他方法,就会将另一个方法压入栈中,当方法执行完毕之后,会将当前方法弹栈。

    4.可变参数
    在方法声明上使用...表示多个相同类型的参数,可变参数使用是有限制的,一般可变参数放在最后,因为可变参数会将尽可能多的参数形成一个整体,也就是组成一个数组,这时如果我们想传入一个单独的参数,并不想让它成为数组的一部分,如果可变参数放在前面这样的操作就无法完成。

    相关文章

      网友评论

          本文标题:Java - Part 2

          本文链接:https://www.haomeiwen.com/subject/ermqxhtx.html