【java基础复习】java中的数组在内存中是如何存储的?

基本数据类型与内存存储

首先,让我们回顾一下基本数据类型的内存存储方式。对于一个基本类型变量,例如int类型的变量a,内存中只有一块内存空间,它存储着该变量的值。这块内存空间具有一个唯一的内存地址。比如 int a = 100 ,a就是内存中一块存储空间的名称,它的地址也就是这块存储空间的地址,比如是0x1112,a的值是100,也就是这块内存空间里的内容。

代码内存地址内存数据
int a = 1000x1112100

数组类型与内存存储

现在让我们考虑数组类型的内存存储方式。对于一个数组变量,例如int数组变量arr,它实际上包含两块内存空间。一块内存空间存储着数组内容本身,另一块内存空间存储着数组的位置(或者说是对数组内容的引用)。

代码内存地址内存数据
int[] arr = {1,2,3}0x11130x3000
0x30001
0x30042
0x30083

为什么数组需要两块空间?

现在让我们回答为什么数组需要两块空间而不能只用一块。考虑以下代码片段:

int[] arrA = {1, 2, 3};
int[] arrB = {4, 5, 6, 7};
arrA = arrB;

在这个代码片段中,我们有两个数组变量arrA和arrB,它们分别具有不同的长度。然后,我们将arrB的值赋给arrA。如果arrA的内存空间直接存储数组内容,那么它将没有足够的空间来容纳arrB的所有元素。这会导致内存溢出或数据丢失的问题。而使用两块空间存储数组变量和数组内容,那么我们进行赋值时,只是对内容地址的赋值,也就是说,当我们执行arrA = arrB;时,实际上是将arrA指向了和arrB相同的内存位置,而arrA原来指向的{1, 2, 3}的内存空间由于不再被引用而可以进行垃圾回收。

这是由于在JVM中,内存被分为不同的区域,包括堆(Heap)、栈(Stack)、方法区(Method Area)等。其中,堆用于存储对象的实例和数组,而栈用于存储局部变量和方法调用的信息。

对于数组来说,实际的数据内容存储在堆内存中。而数组变量(引用)本身存储在栈内存中。当我们执行赋值操作时,实际上是将一个引用复制给另一个引用,这使得两个引用指向了相同的堆内存位置。

下面这张图简单的体现了arrB 和 arrA这两个数组在内存中的存储情况:
在这里插入图片描述
下面这张图体现了在执行arrA = arrB时内存的存储情况。可以看到,只是改变的arrA数组的指向,也就是地址。arrA原来指向的那块堆空间随后会被内存回收。
在这里插入图片描述

希望上面的解释和演示能够帮助大家更好地理解java中的数组的内存存储和赋值原理。

感谢 💖

好啦,这次的分享就到这里,感谢大家看到这里🤞

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不怕娜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值