目录


✨一、 数组基本用法

1.数组的作用

能让我们批量创建相同类型的变量


2.数组的创建

下面这三种创建方式都是可以的

int[] arr1=new int[] {1,2,3,4};

int[] arr2={1,2,3,4};

int[] arr3=new int[4];

3. 数组的使用

(1)获取长度

注意事项

使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作符. 后面在面向对象中会经常用到

代码示例:

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

【JAVA SE】—— 数组(详细!!!)_JAVASE


(2)访问数组中的元素

注意事项:

  1. 使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数
  2. 使用 [ ] 操作既能读取数据, 也能修改数据.
  3. 下标访问操作不能超出有效范围 [0, length) , 如果超出有效范围, 会出现下标越界异常

代码示例:

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        
    //获取数组中的元素的个数
    //System.out.println(array.length);
    
    //访问数组中的元素
     System.out.println(array[1]); // 执行结果: 2
     System.out.println(array[2]); // 执行结果: 3
    
    //修改数组中的元素 
    array[2] = 100; 
     
     System.out.println(array[2]); // 执行结果: 100
}

【JAVA SE】—— 数组(详细!!!)_JAVASE_02


(3)下标越界

数组下标从0开始,范围是 [0,arr.length) ,左闭右开的区间,或者是[ 0,arr.length-1].

如果我们将下标的值超出数组的范围…

如下所示

 public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};
        System.out.println(arr[100]);
    }

【JAVA SE】—— 数组(详细!!!)_JAVA_03


(4)遍历数组(三种方法)

1.遍历方式(一)----- for循环

public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }


2.遍历方式(二)----> for-each

 public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        for (int x:arr) {
            System.out.print(x+" ");
        }
    }

for-each 遍历的原理

​ 遍历array 里面的每一个元素,把每一个元素取出来,然后赋值给了 x ,最后打印 x ,直到 array 里面的元素全部都遍历完成.

两种遍历的方式我们介绍完了,那么for循环和for-each有什么区别?

for循环是可以拿到数组下标的,for-each拿不到数组下标,所以for-each只能够全部遍历,无法对数组元素进行修改或进行操作.


3.遍历方式(三)-----> 使用操作数组的工具类进行数组的打印(Arrays)

​ Arrays 就是操作Java数组的工具类,你要对数组做什么事情,就可以通过他来做,当然有些事情他是完成不了的.

比如说:我们要打印数组,我们本来是用for循环 或者 for-each 来写的,但是我们也可以用Arrays的工具类打印.

通过JDK的工具文档,我们查找到了相应的工具类.
【JAVA SE】—— 数组(详细!!!)_深浅拷贝_04

代码如下:

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

【JAVA SE】—— 数组(详细!!!)_JAVA_05


⛲二、数组作为参数的方法

1.理解引用类型

(1)参数传内置类型

【JAVA SE】—— 数组(详细!!!)_JAVA_06

我们用 内置类型作为参数,进行交换变量,但是最后编译的结果 两个变量却并未发生交换.

这是为什么呢?

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_07

(2)参数传数组类型

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_08

结果:

【JAVA SE】—— 数组(详细!!!)_JAVASE_09

我们用 数组作为参数,进行交换变量,编译运行后,发现成功交换两个变量的值。此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.

那么为什么传引用类型可以 形参可对实参进行操作呢?

这里我们就要先从内存说起

数组在内存中的储存:
【JAVA SE】—— 数组(详细!!!)_数组_10

​ 我们可以知道,数组这个在栈中存放的变量实际存放的是 堆中数据的地址,当我们 arr 数组作为参数 传入 方法里,我们就把 堆中数据的地址 传入了进去,在方法内部,我们可以根据 这个地址 找到堆中的数据进而修改数据,从而实现了形参改变了实参的操作.

如下图:

【JAVA SE】—— 数组(详细!!!)_JAVA_11


总结:

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


(3)JVM内存区域划分

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array ={1,2,3,4,5};
        int a = 10;

    }
}

array 和 a 都是局部变量,在栈上开辟空间
那么问题来了,a的空间里存的是 10,但是数组后面的数据,放在哪里?
和 10 一样放在栈上?
对象是存放在 堆上的

看一下JVM的5个部分

【JAVA SE】—— 数组(详细!!!)_数组_12

【JAVA SE】—— 数组(详细!!!)_JAVA_13

关于上面的划分方式, 后面慢慢理解. 此处我们重点理解 虚拟机 栈 和 堆.

  1. 局部变量和引用保存在栈上, new 出的对象保存在堆上.
  2. 的空间非常, 的空间比较.
  3. 堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈).

(4)初始null

​ 引用很像指针,最大的区别就是不能对 引用 解引用可以对指针解引用,因为在Java没有传址的概念的,其他功能类似,但时两个东西,不是同一个东西,不能混淆在一起。

指针有空指针,那引用有空引用(引用里面存的地址是空的)吗?

有的,只不过跟C语言不同,C是大写NULL,Java是小写null

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array1 = null;
        //当一个引用被赋予null,就代表这该引用不指向任何对象
        // 既然该引用不指向任何对象,那么我这样写代码会怎么样?
        System.out.println(array1.length);
        // 求一个空引用所指向的对象的长度,但是空引用不会指向任何一个对象的
        // 何来的长度?那么代码运行的效果如何?14,由图可知该写法是错误的,另外引用被指为null,堆上是不会分配内存给它的
        // 意思是你都不创建任何对象,你还想拿我空间,疯了?

        System.out.println(array1[0]);
        // 这个写法毫无疑问也是错的,没对象,你怎么访问对象里的东西?
    }
}

【JAVA SE】—— 数组(详细!!!)_数组_14

【JAVA SE】—— 数组(详细!!!)_JAVASE_15