java数组占用内存,java数组的内存分配是如何完成的?
00-1010 1.数组2的内存图。两个数组的内存图3。一个变量和两个数组容器的内存图4。指向一个数组容器的两个变量的内存图前言:本文主要讲解数组的内存图,以便更好地掌握数组和数组的调用流程。不多说就来说说吧。
00-1010 1.数组的内存图
int[]arr=new int[3];//一开始数组arr定义为包含三位数的int类型,初始化为0,0,0 . arr[0]=12;//数组arr的第一位赋值12 arr[2]=14;//数组arr的第三位赋值14 system . out . println(arr[0]);//12 system . out . println(arr[1]);//0 system . out . println(arr[2]);//14 system . out . println(arr);//[I@7852e922解释
如下图:Stack相当于数组变量的地址,heap相当于数组中的元素,它们的下标相当于房间号。
这里我暂时将arr的地址定义为0x001,相当于[I@7852e922]。
我将从介绍数组的调用流开始:
第一步是将arr定义为一个int数组变量,并将其放入堆栈中。数组中的三个元素被放入堆栈,并初始化为0,0,0。第二步是将12和14分别分配给arr[0]和arr[2]。于是我们根据堆栈地址0x001去堆栈找对应的地址,找到房间号0和2,把12和14放在对应的房间号里。所以数组的第一位是12,第三位是14。第三步是输出数组元素和数组的地址。这个很简单!从堆栈中找到数组arr的地址,调用堆栈中对应数组的元素。调用完成后,堆栈和堆中的数据会消失。
看了一个数组内存图,下面的就明白了。
目录
int[] arr1=new int[]{23,12,5 };//开始初始化为23,12,5。system . out . println(arr 1[0]);//23 system . out . println(arr 1[1]);//12 system . out . println(arr 1[2]);//5 system . out . println(arr 1);//0x 001 arr 1[0]=13;//将arr1的第一位指定为13。system . out . println(arr 1[0]);//13int[] arr2={14,18,15 };//同上system . out . println(arr 2[0]);//14 system . out . println(arr 2[1]);//18 system . out . println(arr 2[2]);//15 system . out . println(arr 2);//0x 002 arr 2[1]=12;//赋给arr2的第二位是12 system . out . println(arr 2[1]);//12这与第一个数组的不同之处在于,数组中的所有元素都被初始化并赋值。过程是一样的。首先通过栈找到数组地址,然后根据地址在堆中找到对应的数组元素。数组arr1运行时,将退出堆栈和堆,为arr2腾出空间。也就是说arr1运行后会消失在内存中,arr2数组进入内存进行运算。这两个数组的地址是不同的。
1.数组内存图
int[]arr=new int[3];//定义一个int类型arr数组,其中三个元素初始化为0。system . out . println(arr[0]);//0 arr[0]=3;system . out . println(arr[0]);//3 system . out . println(arr);//0x 001 arr=new int[5];//重新赋值int类型的arr数组,数组包含5个初始化为0的元素,数组的地址也随之改变。system . out . println(arr[0]);//0 arr[0]=5;system . out . println(arr[0]);//5 system . out . println(arr);//0x002如果不明白,看下图。这与其他两种情况的不同之处在于,两个数组都指向同一个变量,这相当于先将干净的水放入同一个杯子中,然后在将水放入饮料之前先将水喝掉。这两个数组和杯子一样,在arr=new int[3]结束时会被new int[5]的数组元素覆盖。所有数组元素和地址都将改变。执行过程和我讲的第一种情况一样。
2.两个数组的内存图
int[]arr 1=new int[3];//定义一个int类型arr数组,其中三个元素初始化为0。system . out . println(arr 1[0]);//0 arr 1[0]=12;system . out . println(arr 1[0]);//12 system . out . println(arr 1);//0x 001 int[]arr 2=arr 1;//将arr1变量赋给arr 2 system . out . println(arr 2[0]);//12 arr 2[0]=13;system . out . println(arr 2[0]);//13 system . out . println(arr 2);//0x 001 system . out . println(arr 1[0]);//13这个案例和上一个案例的区别在于,两个变量指向同一个数组,相当于原来给你发顺丰快递,后来给你发的是童渊快递,但是收件人还是你,地址不会变。因此,当arr1分配给arr2时,其元素和数组地址不会改变。最后,程序输出arr1[0]的值实际上是arr2[0]的值。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。