数组

一维数组

数组类似于一个柜子,柜子有一些带编号的抽屉,可以存储东西,抽屉的编号从0开始依次增加。

1.1定义

//-------定义-------
//与定义变量类似,和C++略有不同;
public class Main {
    public static void main(String[] args) {
        int[] a = new int[10];//创建一个名字叫a的柜子,柜子有10个抽屉,编号从0~9,只能往里面放整数;
        float[] f = new float[33];//创建一个名字叫f的柜子,柜子有33个抽屉,编号从0~32,只能往里面放浮点数;
        double[] d = new double[123];//创建一个名字叫d的柜子,柜子有123个抽屉,编号从0~122,只能往里面放double;
        char[] c = new char[21];//创建一个名字叫c的柜子,柜子有21个抽屉,编号从0~20,只能往里面放字符;
    }
}

1.2初始化

//初始化

public class Main {
    public static void main(String[] args) {
        int[] a = {0, 1, 2};        // 含有3个元素的数组,元素分别是0, 1, 2,等效于C++里的a[] = {0 , 1 , 2};
        int[] b = new int[3];       // 含有3个元素的数组,元素的值均为0,等效于C++里的b[3] = 0;
        char[] d = {'a', 'b', 'c'}; // 字符数组的初始化,等效于C++里的d[] = {'a' , 'b' , 'c'};
    }
}

1.3访问数组元素

数组是默认由下标0开始从前往后灌入;

public class Main {
    public static void main(String[] args) {
        int[] a = {0, 1, 2};  // 数组下标从0开始

        System.out.printf("%d %d %d\n", a[0], a[1], a[2]);

        a[0] = 5;

        System.out.println(a[0]);
    }
}

2.多维数组

本质上多维数组就是数组的数组

二维数组可以形象地理解为行列,例如:a[i][j]可以理解为一个在第i行第j列的元素;

同样,三维数组可以理解为立体空间,例如:a[i][j][k]可以理解为在x = i , y = j , z = k的直角坐标系空间里的一个点;

public class Main {
    public static void main(String[] args) {
        int[][] a = new int[3][4]; 
        // 大小为3的数组,每个元素是含有4个整数的数组。
        //可以理解为一个平面直角坐标系,x在[0 , 3]的自然数,y为[0 , 4]的自然数坐标

        int[][][] b = new int[10][20][30]; // 将所有元素的初值为0
        // 大小为10的数组,它的每个元素是含有20个数组的数组,而这些数组的元素又是含有30个整数的数组
        // 空间直角坐标系中,x在[0 , 10] , y在[0 , 20],z在[0 , 30]之间的自然数坐标;
    }
}

可以测一下下面的结果试试;

public class Main {
    public static void main(String[] args) {
        int[][] a = {           
            {0, 1, 2, 3},       // 第1行的初始值
            {4, 5, 6, 7},       // 第2行的初始值
            {8, 9, 10, 11}      // 第3行的初始值
        };


        for (int i = 0; i < 4; i ++ )  // 将第一行全部变成0
            a[0][i] = 0;

        for (int i = 0; i < 3; i ++ ) {  // 输出二维数组
            for (int j = 0; j < 4; j ++ ) {
                System.out.printf("%d ", a[i][j]);
            }
            System.out.println();
        }
    }
}

3.数组的范围遍历

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[][] a = {
            {0, 1, 2, 3},
            {4, 5, 6, 7},
            {8, 9, 10, 11},
        };

        for (int[] row: a) {  // 范围遍历,相当于for(int i = 0 ; i < a.length ; i++),因为这一层并不是最后一层数组,所以需要一个数组来存储;
            for (int x: row)  // 范围遍历,相当于for(int j = 0 ; j < a[i].length;j++),这是最后一层数组,所以只需要用一个变量就能即时存储与打印;
                System.out.printf("%d ", x);
            System.out.println();
        }
    }
}

4.常用API

1.length:返回数组长度,注意不加小括号

    int[] a={2,5,4,3,1,8};
    int sz = a.length;

2.Arrays.sort():数组排序

        //以下每一次sort都是按照原数组进行,前后操作假装不影响;
        int[] a={2,5,4,3,1,8};
//-------将整个数组从小到大排列-------
        Arrays.sort(a);//1 2 3 4 5 8
//-------将数组从下标i到下标j的数组从小到大排列-------
        Arrays.sort(a,2,5);//2 5 1 3 4 8

3.Arrays.fill(int[] a, int val):填充数组

//-------将数组全部填充为x-------
int[] a = new int[10];
Arrays.fill(a , 100);

//-------指定从下标i到下标j的区域填充为x-------
int[] a = new int[10];
Arrays.fill(a , 3 , 5 , 1000);

4.Arrays.toString():将数组转化为字符串
多用在项目里

int[] a = {1 , 4 , 1 , 5 , 9}
System.out.println(Arrays.toString(a));

打印出来的是

[1 , 4 , 1 , 5 , 9]

而直接打印a和直接打印a.toString()打印出来的都是地址;

System.out.println(a);
System.out.println(a.toString());

以上两种打印出来的都是地址,每个人应该都不一样;

[I@70dea4e

5.Arrays.deepToString():将多维数组转化为字符串

对于多维数组而言,toString又不好使了,它只能打印二维数组中第一维数组的地址;

所以要用到Arrays.deepToString()

import java.util.Arrays;
public class TestDeepToString {
    public static void main(String[] args) {
        int[] array1 = {6, 6, 6};
        int[] array2 = {8, 8, 8};
        int[][] array3 = {array1, array2};
        System.out.println(Arrays.deepToString(array3));    //[[6, 6, 6], [8, 8, 8]]
        System.out.println(Arrays.toString(array3));        //[[I@511d50c0, [I@60e53b93]

6.注意
1.java中的数组不可变长

2.使用Arrays需要import java.util.Arrays;

posted @ 2022-10-10 09:14  Zilliax  阅读(24)  评论(0)    收藏  举报