前言
在Java程序运行时,内存被划分为不同的区域,以提高运算效率。每个区域有特定的作用和内存管理方式。本次讨论的重点是栈空间和堆空间,它们分别负责不同的内存分配和数据存储。
栈空间:用于存储方法调用过程中的局部变量及方法的执行状态。
堆空间:主要存放通过 new
关键字创建的对象及其相关数据。
下列图示:红色为栈空间,蓝色为堆空间
数组内存图(单个数组)
1.先来看第一段代码,定义了一个长度为 3 的数组。由于这是动态初始化数组,因此数组的元素默认值为 0。
2.假设堆空间中的数组地址为 001
,程序会将这个地址赋值给栈空间中的变量。此时,栈中的变量并不是直接存储数组的值,而是存储了该数组在堆空间中的地址。换句话说,栈变量指向的是数组的内存地址,而非数组本身。
3.当访问数组元素时,程序首先通过栈中的地址找到堆中的数组所在内存区域。接着,根据数组的索引值,程序定位到该内存区域中的具体元素,从而访问到对应的值。
最后控制台输出结果为:
001
0
0
0
解释:
- 第一行输出
001
,是栈中存储的数组地址。 - 接下来的三行输出
0
,表示数组的每个元素的默认值。由于这是一个动态初始化的数组,所有元素的默认值为0
。
数组内存图(多个数组)
这段代码定义了两个数组,因此在堆空间中会分别为每个数组分配独立的内存空间,用来存储每个数组的值。每个数组都会有自己的内存地址,栈空间中的变量会存储对应的地址,而不是数组的实际数据。通过这个地址,程序可以访问到堆空间中的数组值。
数组内存图(多个数组指向同一个空间)
代码解释:
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
中的元素值:100
、200
和300
。
当定义第二个数组并将第一个数组的地址赋给它时:
int[] arr2 = arr;
// 第二个数组指向第一个数组
此时,arr2
并不会在堆空间中重新分配一个新的空间,而是直接引用了 arr
数组所在的地址。这意味着 arr
和 arr2
指向的是同一块内存区域,所以对 arr
的修改会影响到 arr2
,反之亦然。
打印结果:
001
111
001
111
解释:
- 第一行
001
和第三行001
都是arr
和arr2
的地址,指向相同的内存位置。 - 第二行和第四行的
111
表示arr
和arr2
的元素值。修改arr
的元素值后,arr2
也反映了同样的变化。
暂无评论内容