--------------------------------------------------------------------------------------------莫听穿林打叶声,一蓑烟雨任平生--------------------------------------------------------------------------------------------

Java笔记day07

day07 
一、数组
1、概念
    1)、数组是存储同一数据类型的多个元素的集合,可以理解为一个容器
    2)、数组既可以存储基本数据类型,也可以存储引用数据类型
2、格式
    1)、格式1:数据类型[] 数组名;
            举例:int[] arr1
    2)、格式2:数据类型 数组名[];
            举例:double arr2[]
    3)、注意事项
        a、以上两种定义,定义之后是没有元素值的
        b、推荐使用第一种格式,都一种格式的可读性更强
3、初始化
    1)、原因
        上面的数组定义之后是没有元素值的,没有任何意义,所以要想使用它就要先初始化
    2)、概念
        初始化是指对数组中的元素进行分配内存空间,并且为元素赋值
        初始化分为动态初始化和静态初始化
    3)、动态初始化
        概念:动态初始化只指定数组长度,由系统为数组分配初始值(默认的初始值为0)
        格式:数据类型[] 数组名 = new 数据类型[数组长度];       //数组长度其实就是数组中元素的个数。    
        举例:int[] arr = new int[3];
        意义:定义了一个int类型的数组,这个数组中可以存放3个int类型的值
    4)、静态初始化
        概念:静态初始化指定每个元素的初始值,由系统自动确定数组长度
        格式:数据类型[] 数组名 = new 数据类型[]{元素值} 
        举例:int[] arr = new int[]{1,2,3};
        意义:定义一个int类型的数组,里面由三个元素值,分别是1,2,3
4、动态初始化详解
    1)、单独定义数组
        int[] arr
        单独使用是没有任何意义的,因为尚未初始化变量arr,未初始化之前不能使用
    2)、索引
        解释:在数组的实际使用中拿到地址值一般是没有意义的,大多数情况下是想获取数组的元素值,这时就需要索引(下标)来获取元素值了
        格式:  数组的名称[索引]        //注意:索引的编号是从0开始的,从左往右的顺序编号
    3)、举例
        int[] arr = new int[3];

        System.out.println(arr); 
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        定义数组语句左边部分:
            int: 说明数组中的元素的数据类型是int类型
            []: 说明它是一个数组类型
            arr: 给数组起个名字
        定义数组语句右边部分:
            new: 代表为数组分配一个内存空间
            int: 说明数组中的元素的数据类型是int类型
            []: 说明它是一个数组
            3: 代表着数组的长度,其实这里的3就是数组元素的个数
        输出:
            ****[I@1540e19d****     //这是数组arr的地址值,十六进制表示,一般情况下无意义
            ****0****               //获取的数组的第一个元素
            ****0****               //获取的数组的第二个元素
            ****0****               //获取的数组的第三个元素
    4)、赋值
        上面的例子给出了数组的初步使用,下面对如何赋值进行解释
        int[] arr = new int[3];     //需求:想要把10,20,30这个三个值分别赋值给数组中的第一个元素,第二个元素,第三个元素
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;
        
        System.out.print(arr+",");    //再打印数组的名字以及数组中的元素
        System.out.print(arr[0]+",");
        System.out.print(arr[1]+",");
        System.out.print(arr[2]);
        ****输出为[I@1540e19d,10,20,30****
5、静态初始化
    1)、初始化时指定每个数组元素的初始值,由系统决定数组长度
    2)、格式
            数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
    3)、举例
            int[] arr = new int[]{1,2,3};
        解释:定义了一个int类型的数组,这个数组中存放了3个int类型的值,并且值分别是1,2,3。
        简化写法:
            int[] arr = {1,2,3};
    4)、注意事项
        1、大括号中值要和定义数组的时候数据类型要一致
        2、使用静态初始化的时候,右边的中括号中不允许出现数字
            如果出现了,就意味着,定义的时候既有动态初始化,也有静态初始化,两者不能混淆使用
                int[] arr1 = new int[5]{1,2,3,4,5};//错误
        3、当初始值不是0的时候,推荐使用静态初始化
    5)、举例
        int[] arr2 = {100,200,300};
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
        ****输出100,200,300****

        System.out.println(arr2[3]);
        ****报错:ArrayIndexOutOfBoundsException: 3****
        ****数组下标索引越界异常,没有对应的索引****

        arr2 = null;      
        System.out.println(arr2[0]); 
        ****NullPointerException 空指针异常,说明没有任何实例****
6、Java初始化内存分布图
    1)、划分
        Java程序为了提高程序运行的效率,就对数据在内存中进行了划分,划分了五个部分
    栈:存储局部变量(方法中定义的变量都称之为局部变量)
    堆:存储new出来的东西
    方法区:面对对象学习
    本地方法区、寄存器暂时不做解释
    2)、堆的特点
        a、堆内存中放的都是new出来的东西
        b、每个变量都有一个系统给的默认值,这个默认值根据类型不同而不同
            byte,short,int,long     0
            float,double            0.0
            char                    '\u0000'
            boolean                 false
            引用数据类型             null
    3)、赋值过程
        a、一个数组赋值
            int[] arr = new int[3];
            System.out.println(arr);        //地址值
            System.out.println(arr[0]);     //0
            System.out.println(arr[1]);     //0
            System.out.println(arr[2]);     //0
                int[] arr定义数组之后会在栈里生成一个地址值[I@1540e19d,位于栈的最底部(栈拥有先进后出的特点)
                这个地址值会映射到堆里,对应一片区域,例如上面的代码就会生成三个区来存放数据
                这里并没有对数组进行赋值,所以堆的三个区里存放的数据是默认值0,0,0

            arr[0] = 10;
            arr[1] = 20;
            arr[2] = 30;
            System.out.print(arr);          //地址值
            System.out.print(arr[0]);       //10
            System.out.print(arr[1]);       //20
            System.out.print(arr[2]);       //30
                堆里原本的数据是0,0,0,在赋值后原来的值被覆盖,分别变成10,20,30
        b、两个数组赋值
            int[] arr1 = new int[3];
            arr1[0] = 10;
            arr1[1] = 20;
            arr1[2] = 30;
            int[] arr2 = new int[3];
            arr2[0] = 40;
            arr2[1] = 50;
            arr2[2] = 60;
            int[] arr1定义数组之后会在栈的最底部生成一个地址值0x0001(假设),堆里的一片区域中生成三个默认值,
                arr1赋值之后有三个数据覆盖默认值(10,20,30)
            int[] arr2定义数组之后会在栈中arr1的上层生成一个地址值0x0002,堆里的另一片区域中生成三个默认值,
                arr2赋值之后有三个数据覆盖默认值(40,50,60)
        c、两个数组特殊赋值
            int[] arr1 = new int[3];
            arr1[0] = 10;
            arr1[1] = 20;
            arr1[2] = 30;
            int[] arr2 = arr1;
            arr2[0] = 40;
            arr2[1] = 50;
            int[] arr1定义数组之后会在栈的最底部生成一个地址值0x0001(假设),堆里的一片区域中生成三个默认值,
                arr1赋值之后有三个数据覆盖默认值(10,20,30)
            int[] arr2定义数组之后arr2和arr1拥有相同的地址,且对应堆里相同的区域
                arr2赋值之后arr1[0]的值由10变成40,arr2[0]的值也是40,arr1[1]的值由20变成50,arr2[2]的值也是50
                而arr1[2]的值由于arr[2]并没有赋值,所以依然为30,同时arr[2]的值也为30
7、数组遍历
        对于动态数组由于知道有多少个元素,可以直接输出数组中的元素,但是元素数量越多输出代码就越多,不方便使用
        对于静态数组是不知道有多少个元素的,所以要用别的方法遍历得到每个元素
    1、动态数组for循环遍历
        int[] arr1 = new int[3];
        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;
        for(i=0;i<3;i++){
            System.out.println(arr[i]);
        }
    2、静态数组for循环遍历
        java中的数组提供一个属性,可以让我们获取到数组的长度,这个属性的名字叫做:length
        使用格式:数组名称.length
        int[] arr2 = {3123,12,43,43,5,4,554,3,432,4,2,23,4,2};
        for(int i=0;i<arr2.length;i++){
            if(i==arr2.length-1){
                System.out.println(arr2[i]+"]");
            }else if(i==0){
                System.out.print("["+arr2[i]+",");
            }else {
                System.out.print(arr2[i]+",");
            }
        }
    3、调用方法遍历数组
        主函数中调用
        int[] arr3 = {33,4143,235,45,76,8,43,23,2,23,4,2};
        printArray(arr3);
        方法
        public static void printArray(int[] array){
        for(int i=0;i<array.length;i++){
            if(i==array.length-1){
                System.out.println(array[i]+"]");
            }else if(i==0){
                System.out.print("["+array[i]+",");
            }else {
                System.out.print(array[i]+",");
            }

        }

 

           明天继续

 

 


    

posted @ 2021-11-29 22:11  等你回眸一笑  阅读(26)  评论(0)    收藏  举报