数组

数组概念
是一块连续固定大小的内存空间,数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
特点
1、数组的长度大小是固定的
2、同一个数组中,存储的元素数据类型是一样的
3、具有索引下标的概念,将来可以通过索引获取元素
4、数组查询快,增删慢
数组的定义格式
格式1:数据类型[] 数组名;
举例:int[] arr; // 定义了一个可以存储int类型的一维数组,数组名叫做arr
格式2:数据类型 数组名[];
注意:这两种定义做完了,数组中是没有元素值的。
数组没有初始化,无法直接使用,数组是我们第一个接触到的引用数据类型

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

动态初始化:先规定数组的大小,数组中的元素先系统赋默认值,后续再自己赋值
语句定义格式:
数据类型[] 数组名 = new 数据类型[数组的大小];
举例:int[] arr = new int[3];
左边
int: 表示存储元素的数据类型
[]: 表示这是一个一维数组
arr: 数组名,符合标识符的命名规则,相当于变量名
右边
new: 在堆内存中开辟空间,将来看到new,就意味着在堆内存中开辟空间
int: 表示存储元素的数据类型
[]: 表示这是一个一维数组
3: 表示该数组最多可以存储3个元素,数组长度为3
白话文解释:创建了一个可以存储3个int类型元素大小的数组,数组名叫做arr
专业术语解释:在堆内存中开辟一个连续空间大小为3的数组对象,将地址值赋值给栈内存中arr变量

public class ArrayDemo2 {
    public static void main(String[] args) {
        //创建一个数组
        int[] arr = new int[3];
        System.out.println(arr); // 地址值
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println("--------------------------");
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}



静态初始化:自己将数据赋值,大小由系统根据我们赋值的数量来决定
语句定义格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,....};
举例:int[] arr1 = new int[]{11,22,33,44,55,66};
简化格式
数据类型[] 数组名 = {元素1,元素2,元素3,....};
举例: int[] arr1 = {11,22,33,44,55,66};

public class ArrayDemo4 {
    public static void main(String[] args) {
        //简化静态初始化
        int[] arr1 = {11,22,33,44,55,66};
        System.out.println(arr1);
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);
        System.out.println(arr1[3]);
        System.out.println(arr1[4]);
        System.out.println(arr1[5]);
    }
}


数组操作常见的两个小问题

数组索引越界
ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生。
空指针异常
NullPointerException
数组引用没有指向实体,却在操作实体中的元素时。

数组获取长度的属性length

语句定义格式 数组名.length 获取的是该数组的长度(元素的个数)
数组的索引最大值 = 数组名.length-1

/*Convert to Basic Latin*/
public class ArrayTest2 {
    public static void main(String[] args) {
        int[] arr = {123, 451, 45, 12, 556, 12, 412};
        //1、默认将第一个元素作为最大值以及最小值
        int maxNumber = arr[0];
        int minNumber = arr[0];
        //2、从第二个元素开始循环依次比较
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > maxNumber) {
                maxNumber = arr[i];
            } else if (arr[i] < minNumber) {
                minNumber = arr[i];
            }
        }
        System.out.println("数组最大值为:" + maxNumber);
        System.out.println("数组最小值为:" + minNumber);
    }
}
/*数组元素逆序 (就是把元素对调)*/
public class ArrayTest3 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        System.out.println("逆序前:");
        printIntArray(arr);
        //实现逆序的方式1:
        int[] resArr1 = niXu1(arr);
        System.out.println("逆序后:");
        printIntArray(resArr1);
        //实现逆序的方式2:
        int[] resArr2 = niXu2(arr);
        System.out.println("逆序后:");
        printIntArray(resArr2);
    }
 /*
        将逆序1的功能封装成一个方法
        小结论:交换的次数 = 数组的长度 / 2
     */
    public static int[] niXu1(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int tmp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = tmp;
        }
        return arr;
    }
    public static void printIntArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            if (i == 0) {
                System.out.print("[" + array[i] + ", ");
            } else if (i == array.length - 1) {
                System.out.print(array[i] + "]");
            } else {
                System.out.print(array[i] + ", ");
            }
        }
        //换行
        System.out.println();
    }
}


二维数组概述
二维数组其实就是一个元素为一维数组的数组。
格式1
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组
n表示每一个一维数组的元素个数
举例
int[][] arr = new int[3][2];
定义了一个二维数组arr
这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
每个一维数组有2个元素,可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素
格式2
数据类型[][] 变量名 = new 数据类型[m][];
m表示这个二维数组有多少个一维数组
这一次没有直接给出一维数组的元素个数,可以动态的给出。
举例
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3]
arr[2] = new int[1];
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
举例
int[][] arr = {{1,2,3},{4,6},{6}};

二维数组遍历

public class Array2Test1 {
    public static void main(String[] args) {
        //创建一个二维数组
        int[][] arr = {{11, 22, 33, 44}, {1, 2, 3}, {100, 200, 300, 400, 500}};
        for (int i = 0; i < arr.length; i++) { // 外层循环控制的是遍历第几个一维数组元素
            for (int j = 0; j < arr[i].length; j++) { // 内层循环控制的是每一个一维数组中元素的遍历
                if (j == 0) {
                    System.out.print("[" + arr[i][j] + ", ");
                } else if (j == arr[i].length - 1) {
                    System.out.print(arr[i][j] + "]");
                } else {
                    System.out.print(arr[i][j] + ", ");
                }

            }
            //换行
            System.out.println();
        }
    }
}

posted @ 2024-08-23 22:31  hello_future  阅读(48)  评论(0)    收藏  举报