Java数组内存图讲解【详解】

文章最后更新时间:2023-06-07 09:57:19

前言

首先大家要明白,Java程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

本次知识点牵扯到了堆空间和栈空间,那么什么是堆空间,什么栈空间?

  • 栈空间:用于存储程序执行时的方法调用和局部变量
  • 堆空间:暂且只要知道new出来的都放在堆空间里

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

1.先来看第一段代码,定义了一个长度(length)为3的数组,因为是动态初始化,所以值默认为0

d2b5ca33bd20241222002041

2.假如这里堆空间里的地址为001,它就会将这个地址值赋值给栈空间里的变量,所以这时变量指向的并不是数组,而是这个数组的地址值

d2b5ca33bd20241222002104

3.当访问数组元素时,先通过地址去找到对应的内存区域,再根据索引找到对应的元素

d2b5ca33bd20241222002132

4.控制台输出结果为

001
0
0
0

数组内存图(单个数组)

d2b5ca33bd20241222002240

arr [0] = 100         //将100赋值给数组里的0索引
arr [2] = 200      //将200赋值给数组里的2索引

最后输出结果为

100
0
200

数组内存图(多个数组)

d2b5ca33bd20241222002313

这段代码定义了两个数组,所以它在堆空间就会开辟出两个空间用来存放数组里的值。

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

d2b5ca33bd20241222002327

代码解释:

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

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

输入打印结果:

001
100
200
300

定义第二个数组指向第一个数组,这时它不会去堆空间里重新开辟一个空间,而是将arr的地址赋值arr2。所以就出现了同一内存地址的两个数组,当其中一个数组发生改变,另一个也会发生改变。

这时我们再去打印结果:

001
111
001
111

© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容