Java 数组内存解析图解

Java 数组内存解析图解

前言

在Java程序运行时,内存被划分为不同的区域,以提高运算效率。每个区域有特定的作用和内存管理方式。本次讨论的重点是栈空间和堆空间,它们分别负责不同的内存分配和数据存储。

栈空间:用于存储方法调用过程中的局部变量及方法的执行状态。
堆空间:主要存放通过 new 关键字创建的对象及其相关数据。

下列图示:红色为栈空间,蓝色为堆空间

数组内存图(单个数组)

1.先来看第一段代码,定义了一个长度为 3 的数组。由于这是动态初始化数组,因此数组的元素默认值为 0。

d2b5ca33bd20250121211225

2.假设堆空间中的数组地址为 001,程序会将这个地址赋值给栈空间中的变量。此时,栈中的变量并不是直接存储数组的值,而是存储了该数组在堆空间中的地址。换句话说,栈变量指向的是数组的内存地址,而非数组本身。

d2b5ca33bd20250121211234

3.当访问数组元素时,程序首先通过栈中的地址找到堆中的数组所在内存区域。接着,根据数组的索引值,程序定位到该内存区域中的具体元素,从而访问到对应的值。

d2b5ca33bd20250121211244

最后控制台输出结果为:

001
0
0
0

解释:

  • 第一行输出 001,是栈中存储的数组地址。
  • 接下来的三行输出 0,表示数组的每个元素的默认值。由于这是一个动态初始化的数组,所有元素的默认值为 0

数组内存图(多个数组)

d2b5ca33bd20250121211255

这段代码定义了两个数组,因此在堆空间中会分别为每个数组分配独立的内存空间,用来存储每个数组的值。每个数组都会有自己的内存地址,栈空间中的变量会存储对应的地址,而不是数组的实际数据。通过这个地址,程序可以访问到堆空间中的数组值。

数组内存图(多个数组指向同一个空间)

d2b5ca33bd20250121211304

代码解释:

int[] arr = new int[3];           // 定义了一个长度为3的数组

arr[0] = 100; arr[1] = 200; arr[2] = 300;          // 将值赋给数组中的对应索引

  • arr 是一个长度为 3 的数组,分配在堆空间中。栈空间存储了 arr 的地址。
  • 给 arr 的每个元素赋值 100、200 和 300,这些值存储在堆空间中的 arr 数组中。

输入打印结果:

001
100
200
300

解释:

  • 第一行 001 是栈空间中的 arr 数组的地址。
  • 后三行分别输出数组 arr 中的元素值:100200 和 300

当定义第二个数组并将第一个数组的地址赋给它时:

int[] arr2 = arr;              // 第二个数组指向第一个数组

此时,arr2 并不会在堆空间中重新分配一个新的空间,而是直接引用了 arr 数组所在的地址。这意味着 arr 和 arr2 指向的是同一块内存区域,所以对 arr 的修改会影响到 arr2,反之亦然。

打印结果:

001
111
001
111

解释:

  • 第一行 001 和第三行 001 都是 arr 和 arr2 的地址,指向相同的内存位置。
  • 第二行和第四行的 111 表示 arr 和 arr2 的元素值。修改 arr 的元素值后,arr2 也反映了同样的变化。
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容