十分钟让你掌握java数组的重点部分

219 阅读4分钟

94C7F3CA18BF2BCCF52552FAF632FA38.jpg

1.数组的初始化

数组的初始化主要分为动态初始化以及静态初始化

1.动态初始化

在创建数组时,直接指定数组中元素的个数

int[] array = new int[5];

1.2 静态初始化

在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

int[] array = {1, 2, 3};

两种初始化方式没有本质区别,只是书写上的差异。

【注意事项】

  1. 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  2. 静态初始化时, {}中数据类型必须与[]前数据类型一致。
  3. 静态初始化可以简写,省去后面的new 类型[]。

2. 数组遍历的方法

数组的长度该如何求解?

如果是C语言的话,需要调用strlen库函数。
但是Java不需要。Java中计算数组长度的方法是 数组名 + .length

使用 for-each 遍历数组

for each:又叫增强for循环,for each在遍历的时候无法拿到数组的下标。

image.png

public static void main(String[] args) {
        int[] arr = {10, 20, 30};
        for (int x: arr) {
            System.out.println(x + " ");
        }
}

image.png

3. 数组转字符串

*这里需要用到 Arrays 这个方法,

而 Arrays 是Java里自带的一个方法,方法的参数是数组名

这个方法在使用的时候需要提供一个包:

import java.util.Arrays;
 public static void main(String[] args) {
        int[] arr = {10, 20, 30};
        String ret = Arrays.toString(arr);
        System.out.println(ret);
 }

image.png

4. 理解数组是一种引用数据类型

4.1 什么是引用类型

引用数据类型创建出来的变量,称为对象的引用。

引用中存储了对象的地址。

 public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int[] array = {1, 2, 3};
 }

image.png

array 是一个引用。array 这个引用,指向一个对象,并且存了一个对象的地址。

从上图可以看到,引用变量并不直接存储对象本身。
可以简单理解成存储的是对象在堆中空间的起始地址。
通过该地址,引用变量便可以去操作对象。

4.2 空引用 null

null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位。
因此不能对这个内存进行任何读写操作。在一些程序中要判断是不是空引用来防止报错。

5.数组的应用场景

作为函数的参数

public static void func1(int[] arr) {
        arr = new int[10];
}

public static void func2(int[] arr) {
        arr[0] = 99;
}

public static void main(String[] args) {
        int[] array = {1,2,3,4};
        func1(array);
        System.out.println(Arrays.toString(array));
        func2(array);
        System.out.println(Arrays.toString(array));

}
image.png

func1方法:改指向的对象

image.png

array 传给func1后,本来arr也会指向array,arr中存放的也会是array的地址;
但是func1重新开辟了一块新的空间,arr也就指向了这块空间。
由于是两块不同的空间,形参指向的改变不会影响实参的打印
数组的值不会改变,输出 1 2 3 4。

func2方法: 改指向对象的内容

image.png

func2改变了指向的内容(数组下标为0的值),指向并没有改变
这个时候输出,值也会改变。输出 99 2 3 4

总结:

所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实 只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)。

6.二维数组

6.1 理解二维数组是特殊的一维数组

image.png

二维数组的每一个元素都是一个一位数组。

public class Exercise {
    public static void main(String[] args) {
        int[][] array = { {1, 2, 3}, {4, 5, 6} };
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }
}

image.png

6.2 理解不规则数组

不规则数组指的是二维数组的列可以省略行不可以省略

public class Exercise {
    public static void main(String[] args) {
        int[][] array = new int[2][];//数组有两行
        array[0] = new int[20];//第一行有20个元素
        array[1] = new int[10];//第二行有10个元素
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }
}

image.png

可以看到当二维数组的列省略后,可以对列进行指定大小。
这就造成了每一行的元素可以是不同的数量,也就是每一行列的数量不同。
视觉上看上去就是一种不规则的二维数组。