java一维数组的内存解析-经典(尚硅谷记录)

1、java内存简化结构介绍

2、通过一段代码举例内存解析过程

main方法中的代码如下:

(1) 第一行的执行情况:int[] arr = new int[]{1,2,3};

  • 左边运算:放在方法中的变量都叫做局部变量,故 “=”左侧的arr放在栈(stack)中
  • 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故 int[]{1,2,3},会在堆里申请3个连续的结构存值(此时赋默认值0,由于int型默认值为0);然后连续空间会有一个首地址值,假如为 0x34ab
  • 赋值运算:将0x34ab赋值左侧栈空间变量arr,所以arr能够找到堆空间数组;然后进行1,2,3赋值给堆空间(将原来默认值0覆盖);

图示例:

(2) 第二行的执行情况:String[] arr1 = new String[4];

  • 左边运算:放在方法中的变量都叫做局部变量,故 “=”左侧的arr1放在栈(stack)中
  • 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故new String[4],会在堆里申请4个连续的结构存值(此时赋默认值null,由于String型默认值为null);然后连续空间会有一个首地址值,假如为 0x12ab
  • 赋值运算:将0x12ab赋值左侧栈空间变量arr1,所以arr1能够找到堆空间数组;然后进行null,null,null,null赋值给堆空间(没有赋值,故为默认值null);

(3) 第三行的执行情况:arr1[1] = "刘德华"; 

  • 左边运算:arr1通过0x12ab的指引,找到arr1第二个位置(arr[1]的1是第二个位置,因为从0开始)
  • 赋值运算:将第二个位置原来的null,赋值成“刘德华”;

 

(4) 第四行的执行情况:arr1[2] = "张学友"; 

  • 左边运算:arr1通过0x12ab的指引,找到arr1第三个位置(arr[2]的3是第二个位置,因为从0开始)
  • 赋值运算:将第三个位置原来的null,赋值成“张学友”;

 

(5) 第五行的执行情况:arr1 = new String[3]; 

  • 右边运算:“=”右侧的new结构,按照1中简化结构规则放在堆(heap)中; 故new String[3],会在堆里申请3个连续的结构存值(此时赋默认值null,由于String型默认值为null);然后连续空间会有一个首地址值,假如为 0x5566
  • 赋值运算:将0x5566又赋值给了左侧原来已有的变量arr1,就会把原来arr1指的值0x12ab变成arr1指向堆空间的0x5566;然后进行null,null,null赋值给堆空间(没有赋值,故为默认值null);

(6) 第六行的执行情况:System.out.println(arr[1]); //截图简写了代码

  •  此时结果为:null

(7)空间回收

  • 该代码栈空间没有变量指向堆空间了,就会在某个时间堆空间被回收
  • 等main函数执行完后,栈空间的变量会按照从栈顶到栈底判断回收;如题栈顶的变量arr1变量出栈回收后;0x5566指向堆的指针没有,被回收;指向的堆空间被回收;
  • 再继续判断栈顶回收(第二个变量成为了此时的栈顶,原来第一个变量已出栈)

 

备注:上面提到的默认值

java默认初始化
数组元素类型默认值
整型0
浮点型0.0
char型
  1. 默认unicode编码,为‘\u0000’
  2. 采用ASCII编码,会乱码,显示为:     口
  3. 转换成int型后,为0
booleanfalse
引用数据类型,如stringnull

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值