Java数组内存图讲解[Java内存]

温馨提示:本文最后更新于2024-08-23 16:53:00,某些文章具有时效性,若有错误或已失效,请联系星雨站长

前言

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

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

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

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

图片[1]-Java数组内存图讲解[Java内存]-星雨博客

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

图片[2]-Java数组内存图讲解[Java内存]-星雨博客

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

图片[3]-Java数组内存图讲解[Java内存]-星雨博客

4.控制台输出结果为

001
0
0
0

数组内存图(单个数组)

图片[4]-Java数组内存图讲解[Java内存]-星雨博客

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

最后输出结果为

100
0
200

数组内存图(多个数组)

图片[5]-Java数组内存图讲解[Java内存]-星雨博客

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

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

图片[6]-Java数组内存图讲解[Java内存]-星雨博客

代码解释:

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
喜欢就支持一下吧!
点赞20赞赏 分享