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
boolean false
引用数据类型,如string null

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/weixin_46932303/article/details/113044738