Java学习笔记30——数组

数组

数组概念

1、数组是存储同一数据类型的多个元素的集合,暂时理解为一个容器
2、数组既可以存储基本数据类型,也可以存储引用数据类型

数组的定义格式

格式1:数据类型[] 数组名;
    举例:int[] arr1
格式2:数据类型 数组名[];
    举例:double arr2[]

注意

这两种定义做完了,数组中是没有元素值的。
针对于这两种定义数组的格式,推荐使用第一种,因为第一种的定义格式
可读性更强。早期的时候很多人喜欢用第二种,但是慢慢地发展,使用第一种的人越来越多了
如果说只是简单地定义了一个数组,但是呢,数组里面却没有值,没有任何意义。
所以要想使用它,就必须先做初始化。

什么叫初始化?

就是为数组中地元素进行分配内存空间,并且为元素赋值。

如何对数组的元素进行初始化呢?

1、动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
    先不赋值
2、静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
    先赋值

动态初始化

初始化时只指定数组长度,由系统为数组分配初始值。
    格式:数据类型[] 数组名 = new 数据类型[数组长度];
    数组长度其实就是数组中元素的个数。
    举例:
    int[] arr = new int[3];
    解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。
public class ArrayDemo1 {
    public static void main(String[] args) {
        //定义一个数组,int类型地数组
//        int[] arr;
        //单独使用是没有任何意义地,因为尚未初始化变量arr,未初始化之前不能使用
//        System.out.println(arr);

        //动态初始化的方式定义一个int类型的数组,长度为3
        int[] arr = new int[3];
        /**
         *    左边:
         *      int: 说明数组中的元素的数据类型是int类型
         *      []: 说明它是一个数组类型
         *      arr: 给数组起个名字
         *
         *    右边:
         *      new: 代表为数组分配一个内存空间
         *      int: 说明数组中的元素的数据类型是int类型
         *      []: 说明它是一个数组
         *      3: 代表着数组的长度,其实这里的3就是数组元素的个数
         *
         *   学生[] 一班 = new 学生[50];
         *
         */

        System.out.println(arr); //[I@4554617c 地址值 十六进制的
        //但是呢,在实际编写代码的过程中,拿到地址值是没有任何意义的,我们大多数情况下
        //实际上是想获取数组的元素值,怎么获取呢?
        //数组里面提供了一个类似于编号的作用的东西,我们称之为索引(下标)
        //如何通过索引获取数组中的元素呢?
        //语法格式:
        //      数组的名称[索引]
        //注意:索引的编号是从0开始的,从左往右的顺序编号。

        //获取arr数组中的第一个元素
        System.out.println(arr[0]);
        //获取arr数组中的第二个元素
        System.out.println(arr[1]);
        //获取arr数组中的第三个元素
        System.out.println(arr[2]);
    }
}

Java中的内存分配

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈:存储局部变量方法中定义的变量都称之为局部变量
堆:存储new出来的东西
方法区(面向对象的时候说)
本地方法区(和系统相关)
寄存器(给CPU使用)

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
============================================================================================
堆内存的特点:
1、堆内存中放的都是new出来的东西
2、每个变量都有一个系统给的默认值,这个默认值根据数据类型不同,默认值也不同

数据类型 默认值
byte,short,int,long 0
float,double 0.0
char ' \u0000 '
boolean false
引用数据类型 null

我们知道了如何定义一个数组,以及如何获取数组
中的每个元素。但是,此时数组中的元素的值是系统默认给的值,大多数情况下
我们定义一个数组,实际上想存的是我们自己给的值
如何将我们想给的值赋值给数组中的元素呢?
public class ArrayDemo2 {
    public static void main(String[] args) {
        //动态初始化定义一个数组,元素是int类型的,元素个数为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]);

        //需求:想要把10,20,30这个三个值分别赋值给数组中的第一个元素,第二个元素
        //第三个元素
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;

        //再打印数组的名字以及数组中的元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

    }
}

定义两个数组,分别输出数组名及元素。int类型的数组
然后分别给数组中的元素赋值,分别再次输出数组名及元素。

public class ArrayDemo3 {
    public static void main(String[] args) {
        //定义一个数组(动态初始化的方式)
        int[] arr1 = new int[3];
        arr1[0] = 11;
        arr1[1] = 22;
        arr1[2] = 33;
        System.out.println(arr1);//[I@1540e19d
        System.out.println(arr1[0]);//11
        System.out.println(arr1[1]);//22
        System.out.println(arr1[2]);//33

        //定义第二个数组(动态初始化的方式)
        int[] arr2 = new int[4];
        arr2[0] = 44;
        arr2[1] = 55;
        arr2[2] = 66;
        System.out.println(arr2);//[I@677327b6
        System.out.println(arr2[0]);//44
        System.out.println(arr2[1]);//55
        System.out.println(arr2[2]);//66
        System.out.println(arr2[3]);//0(系统默认值)
    }
}
定义两个数组,先定义一个数组,赋值,输出。
然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
然后给第二个数组赋值,再次输出两个数组的名及元素。

public class ArrayDemo4 {
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        arr1[0] = 11;
        arr1[1] = 22;
        arr1[2] = 33;

        int[] arr2 = arr1 ;
        arr2[0] = 100;
        arr2[1] = 200;
        System.out.println(arr1);//[I@1540e19d
        System.out.println(arr1[0]);//100
        System.out.println(arr1[1]);//200
        System.out.println(arr1[2]);//33
        System.out.println("===========================================");
        System.out.println(arr2);//[I@1540e19d
        System.out.println(arr2[0]);//100
        System.out.println(arr2[1]);//200
        System.out.println(arr2[2]);//33
    }

静态初始化

静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

格式:
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
举例:
    int[] arr = new int[]{1,2,3};
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,
        并且值分别是1,2,3。
    其实这种写法还有一个简化的写法
    int[] arr = {1,2,3};


注意事项
    1、大括号中值要和定义数组的时候数据类型要一致
    2、使用静态初始化的时候,右边的中括号中不允许出现数字
        如果出现了,就意味着,定义的时候既有动态初始化,也有静态初始化
        两者不能混淆
        int[] arr1 = new int[5]{1,2,3,4,5};//错误
    3、当初始值不是0的时候,推荐使用静态初始化
    
    public class ArrayDemo5 {
    public static void main(String[] args) {
        //静态初始化定义数组给11,22,33,44,55
        int[] arr = new int[]{11,22,33,44,55};
//        int[] arr1 = new int[5]{1,2,3,4,5};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        System.out.println(arr[4]);


        //静态初始化简化版
        int[] arr2 = {100,200,300};
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
        //ArrayIndexOutOfBoundsException: 3
        //数组下标索引越界异常,没有对应的索引
//        System.out.println(arr2[3]);

        arr2 = null;
        //NullPointerException 空指针异常,说明没有任何实例
//        System.out.println(arr2[0]);
    }
}

数组遍历

/*
        数组遍历(依次输出数组中的每一个元素)

 */
public class ArrayDemo6 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = new int[8];
        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;
        arr[3] = 44;
        arr[4] = 55;
        arr[5] = 66;
        arr[6] = 77;
        arr[7] = 88;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        System.out.println(arr[4]);
        System.out.println(arr[5]);
        System.out.println(arr[6]);
        System.out.println(arr[7]);

        System.out.println("======for循环改进============");
        for(int i=0;i<8;i++){
            System.out.println(arr[i]);
        }
        System.out.println("=====for循环改进2=================");
        //由于我们上面的数组arr可以一眼就能数清有多少个元素,所以在循环的时候,可以
        //确定一个范围
        //但是呢,当我们数组中的元素有非常多的时候,这时候就不一定能数清了
        //如果有一个办法可以获取数组元素的个数就好了
        //java中的数组提供一个属性,可以让我们获取到数组的长度
        //这个属性的名字叫做:length
        //使用格式:
        //  数组名称.length

        int[] arr2 = {3123,12,43,4,423,12,32,4,12,312,41,3,1,45324,23,4,3,12,3,21,412,3,21,3,21,4,21,3,213,43,5,4,554,3,432,4,2,23,4,2};
        System.out.println(arr2.length);
        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]+",");
            }

        }

        System.out.println("=====用方法改进打印arr2======================");

        printArray(arr2);
        System.out.println("=====用方法改进打印arr======================");
        printArray(arr);
    }

    /**
     *  返回值类型:void
     *  参数列表:int[]
     *
     */
    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-30 22:51  欧朋  阅读(78)  评论(0)    收藏  举报