Java基础知识精通数组的内存分析

 更新时间:2022年04月28日 15:41:57   作者:猿界的小皮皮  
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。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 实现图片压缩的两种方法

    Java 实现图片压缩的两种方法

    这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • java解析xml之sax解析xml示例分享

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式;这种解析方法速度快、占用内存少,但是它需要应用程序自己处理解析器的状态,实现起来会比较麻烦
    2014-01-01
  • Spring4下validation数据校验无效(maven)的解决

    Spring4下validation数据校验无效(maven)的解决

    这篇文章主要介绍了Spring4下validation数据校验无效(maven)的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot配置数据库密码加密的方法

    SpringBoot配置数据库密码加密的方法

    由于系统安全的考虑,配置文件中不能出现明文密码的问题,本文就给大家详细介绍下springboot配置数据库密码加密的方法,下面话不多说了,来一起看看详细的介绍吧,需要的朋友可以参考下
    2023-08-08
  • mybatis中<if>标签bool值类型为false判断方法

    mybatis中<if>标签bool值类型为false判断方法

    这篇文章主要给大家介绍了关于mybatis中<if>标签bool值类型为false判断方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 基于java file 文件操作operate file of java的应用

    基于java file 文件操作operate file of java的应用

    本篇文章介绍了,基于java file 文件操作operate file of java的应用。需要的朋友参考下
    2013-05-05
  • SpringBoot Security从入门到实战示例教程

    SpringBoot Security从入门到实战示例教程

    Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,接下来通过本文给大家介绍SpringBoot Security从入门到实战示例教程,感兴趣的朋友一起看看吧
    2022-05-05
  • Java的Spring框架中bean的继承与内部bean的注入

    Java的Spring框架中bean的继承与内部bean的注入

    这篇文章主要介绍了Java的Spring框架中bean的继承与内部bean的注入,Spring框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • 浅析Java中ConcurrentHashMap的存储流程

    浅析Java中ConcurrentHashMap的存储流程

    ConcurrentHashMap技术在互联网技术使用如此广泛,几乎所有的后端技术面试官都要在ConcurrentHashMap技术的使用和原理方面对小伙伴们进行360°的刁难,本文详细给大家介绍一下ConcurrentHashMap的存储流程,需要的朋友可以参考下
    2023-05-05
  • Springboot配置security basic path无效解决方案

    Springboot配置security basic path无效解决方案

    这篇文章主要介绍了Springboot配置security basic path无效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论