数组的内存分配

本文详细解析了Java中数组的内存分配过程,包括动态初始化时的堆栈关系、静态初始化的默认值行为,以及两个数组可能指向同一地址的情况。
摘要由CSDN通过智能技术生成

目录

一.Java中数组的内存分配

1.基本内存分配概念

2.动态初始化内存图解 

3.静态初始化内存图解 

4.两个数组的内存图

5.两个数组指向同一个地址值内存图


一.Java中数组的内存分配

1.基本内存分配概念

区域名称

作用

寄存器

给CPU使用,和我们开发无关

本地方法栈

JVM在使用操作系统功能的时候使用,和我们开发无关

方法区

存储可以运行的class文件

堆内存

存储对象或者数组,new来创建的,都存储在堆内存

方法栈

方法运行时使用的内存,且存储局部变量。main方法运行,进入方法栈执行

2.动态初始化内存图解 

int[] arr = new int[3];
System.out.println(arr);//[I@10f87f48
System.out.println(arr[0]);//0
System.out.println(arr[1]);//0
System.out.println(arr[2]);//0

int[] arr存放在堆内存,new int[3]存放在栈内存。

在堆内存中每一个new出来的对象都有一个唯一的地址值,就像[I@10f87f48。int[] arr = new int[3]就相当于把堆内存的地址值[I@10f87f48赋值给栈内存的数组;System.out.println(arr)则会打印地址值。

堆内存每一个对象的数据类型在没有赋值的情况下都有默认值。当执行打印语句时:

System.out.println(arr[0]);//0

System.out.println(arr[1]);//0

System.out.println(arr[2]);//0

就会打印出0。

栈内存通过地址值[I@10f87f48找到堆内存对应的[I@10f87f48地址值,通过索引找到相应的值。

3.静态初始化内存图解 

int[] arr = new int[]{1,2,3};
System.out.println(arr);//[I@10f87f48
System.out.println(arr[0]);//1
System.out.println(arr[1]);//2
System.out.println(arr[2]);//3

当静态初始化时,会有默认值,从而对数组进行赋值,默认值将被覆盖。 

4.两个数组的内存图

int[] arr1 = new int[2];
int[] arr2 = new int[3];
System.out.println(arr1);//[I@10f87f48
System.out.println(arr1[0]);//0
System.out.println(arr1[1]);//0

System.out.println(arr2);//[I@b4c966a
System.out.println(arr2[0]);//0
System.out.println(arr2[1]);//0
System.out.println(arr2[2]);//0

arr1[0] = 5;
arr2[1] = 10;
arr2[2] = 20;
System.out.println(arr1);//[I@10f87f48
System.out.println(arr1[0]);//5
System.out.println(arr1[1]);//0

System.out.println(arr2);//[I@b4c966a
System.out.println(arr2[0]);//0
System.out.println(arr2[1]);//10
System.out.println(arr2[2]);//20

 

 动态初始化arr1和arr2,在堆内存中开辟新的空间,通过不同的地址值,对默认值进行赋值。

5.两个数组指向同一个地址值内存图

int[] arr1 = new int[2];
arr1[0] = 15;
arr1[1] = 30;
System.out.println(arr1);//[I@10f87f48
System.out.println(arr1[0]);//15
System.out.println(arr1[1]);//30

int[] arr2 = arr1;
arr2[0] = 50;
arr2[1] = 40;
System.out.println(arr1);//[I@10f87f48
System.out.println(arr1[0]);//50
System.out.println(arr1[1]);//40

System.out.println(arr2);//[I@10f87f48
System.out.println(arr2[0]);//50
System.out.println(arr2[1]);//40

初始化arr1,之后进行赋值操作,则结果为15,30;

定义数组arr2,把第一个数组arr1的地址值赋给第二个数组,数组arr2会根据地址值找到堆内存中数组arr1的地址,进而对其进行赋值,覆盖了数组arr1的数值,结果为50,40。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值