Java基础知识精通数组的内存分析
前言:本文章主要讲解数组的内存图,更好地掌握数组以及数组调用流程,话不多说开讲。
1.数组内存图
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
解释
如下图:栈相当于存放数组变量的地址,堆相当于存放数组里面的元素而他们的下标就相当于房间号。
在这里我临时定义arr的地址是0x001等同于[I@7852e922。
下面我开始介绍一下数组的调用流程 :
- 第一步刚开始定义arr为int型数组变量放在栈里,数组里面的三个元素放在堆里并初始化为0,0,0。
- 第二步分别把12,14赋值给arr[0],arr[2]。所以我们根据栈的地址0x001去堆里找到相应的地址,找到房间号0、2并把12、14放到相应的房间号。这样数组第一位为12,第三位为14。
- 第三步输出数组元素以及数组的地址。这个就很简单啦!从栈里找到数组arr的地址去堆里调用相应数组的元素。
调用完成之后,栈和堆里的数据就会消失。
看懂了一个数组内存图,下面几个就会看懂啦。

2.两个数组的内存图
int[] arr1 = new int[]{23,12,5}; //一开始就初始化为23、12、5。
System.out.println(arr1[0]); //23
System.out.println(arr1[1]); //12
System.out.println(arr1[2]); //5
System.out.println(arr1); //0x001
arr1[0] = 13; //把13赋值给arr1第一位。
System.out.println(arr1[0]); //13
int[] arr2 = {14,18,15}; //与上面同理
System.out.println(arr2[0]); //14
System.out.println(arr2[1]); //18
System.out.println(arr2[2]); //15
System.out.println(arr2); //0x002
arr2[1] = 12; //赋值给arr2第二位为12
System.out.println(arr2[1]); //12
- 这个与第一个数组不同的是数组里面的元素全部被初始化赋值。
- 流程都一样,都是先通过栈找到数组地址根据地址去堆寻找相应数组元素。
- 当数组arr1运行完后会退出栈和堆,给arr2让出内存空间。也就是说arr1运行完后会消失于内存,arr2数组进入内存进行操作。
- 这两个数组的地址不一样。

3.一个变量两个数组容器的内存图
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); //0x001 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]数组元素所覆盖。所有的数组元素和地址会改变。
- 执行流程跟我讲的第一个案例一样。

4.两个变量指向一个数组容器的内存图
int[] arr1 = new int[3]; //定义一个int型的arr数组,包含三个元素初始化为0。 System.out.println(arr1[0]); //0 arr1[0] = 12; System.out.println(arr1[0]); //12 System.out.println(arr1); //0x001 int[] arr2 = arr1; //把arr1变量赋值给arr2 System.out.println(arr2[0]); //12 arr2[0] = 13; System.out.println(arr2[0]); //13 System.out.println(arr2); //0x001 System.out.println(arr1[0]); //13
- 这个案例与上一个案例不同的是这个案例是两个变量指向同一个数组,就相当于原本给你发顺丰快递,后来给你改发为圆通快递,但是收件人依旧是你,地址也不会发生改变。
- 所以arr1赋值给arr2,里面的元素与数组地址都不会改变。
- 最后程序输出arr1[0]的值实际上是arr2[0]的值。

相关文章
java(swing)+ mysql实现学生信息管理系统源码
这篇文章主要分享了java mysql实现学生信息管理系统的源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-11-11
Mybatis-Plus处理Mysql Json类型字段的详细教程
这篇文章主要给大家介绍了关于Mybatis-Plus处理Mysql Json类型字段的详细教程,Mybatis-Plus可以很方便地处理JSON字段,在实体类中可以使用@JSONField注解来标记JSON字段,同时在mapper.xml中使用json函数来操作JSON字段,需要的朋友可以参考下2024-01-01
idea配置全局变量Jdk、maven仓库以及maven详解(全文图解)
这篇文章主要给大家介绍了关于idea配置全局变量Jdk、maven仓库以及maven的相关资料,在配置JDK和Maven之前,需要确保已经正确安装了JDK和Maven,文中通过图文介绍的非常详细,需要的朋友可以参考下2024-01-01
通过xml配置SpringMVC注解DispatcherServlet初始化过程解析
这篇文章主要为大家介绍了通过xml配置SpringMVC注解DispatcherServlet初始化过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-10-10
springboot 2.x整合mybatis实现增删查和批量处理方式
这篇文章主要介绍了springboot 2.x整合mybatis实现增删查和批量处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09
Spring Cloud Nacos 和 Eureka区别解析
Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服务框架中的服务注册和发现组件,用于帮助开发者轻松地构建和管理微服务应用,这篇文章主要介绍了Spring Cloud Nacos 和 Eureka区别,需要的朋友可以参考下2023-08-08


最新评论