详解Java中一维、二维数组在内存中的结构


Posted in Python onFebruary 11, 2021

前言

       我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的。当它的数组元素是基本数据类型时,这个数组就是一个一维数组;当它的数组元素是引用数据类型时,它就是一个多维数组。比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组。

1、内存中的简化结构

       内存也叫做主存,它是计算机五大部件(输入设备、输出设备、运算器、控制器、存储器)中存储器的一部分。在Java中我们可以简单的将 内存分为栈、堆和方法区三部分,其中方法区又包含了常量池和静态域。如下图所示,下面来解释一下这三部分的作用:
                   属于线性表中的一种,它 具有先进后出的性质,在 Java 中我们 用来存放局部变量,如某方法里的数组名。
                   它存放的东西其长度、类型不一定相等,一般存放的都是 new 出来的结构,像数组、对象这些
       方法区     可以存放各种我们自定义的方法。

详解Java中一维、二维数组在内存中的结构

 内存的简单结构

2、一维数组

       下面我们来通过代码了解一下,一维数组在内存中的表现形式。我们先定义一个ArrayTest类。

public class ArrayTest{
		public static void main(String[] args){
			//定义三个数组 a[]、b[]、c[]
			int[] a = new int[]{1,2,3};
			float[] b = new float[3];
			String[] c = new String[4];
			
			//给特定元素赋值
			c[1] = "张三";
			c[2] = "李四";
			
			//改变变量指向
			c = new String[2];
		}
	}

       上面的代码中,我们定义了三个数组 a[ ]、b[ ]、c[ ] 就相当于 在堆开辟了三个各自连续的空间作为数组,如果指定了数组元素的值,则存放的是各个指定的值。如果没有指定,则存放的是默认该数组类型的初始化值,如 b[ ] 。然后会 在栈里依次定义三个变量 a、b、c ,三个变量存放的是各自对应的数组的地址值,如 a 存放的是 0x1234,而堆里该数组的地址是 0x11234 。
       给元素赋值的话就相当于用我们指定的值覆盖原有的值。下面我们来重点看一下这一句:

c = new String[2];

      原本栈中的 c 变量存放的地址是 0x12ab 的,指向绿色的数组,但是我们 使用了这句话就相当于在堆中又重新开辟了一个数组,并将这个数组的地址赋给了变量 c ,也就是说** c 这个时候的指向变量,不再指向原来的数组了,而是指向了新的数组**。而没有变量指向的原有数组会被 Java 自动回收。这就是一维数组在内存中的表现形式。那么二维数组在内存中又是如何表示的呢?

详解Java中一维、二维数组在内存中的结构

 一维数组在内存中的表现形式

3、二维数组

       其实 在底层中并没有二维数组这个概念,我们知道数组是引用数据类型,其元素值可以是基本数据类型,又可以是引用数据类型。所谓的 二维数组其实就相当于我们在内存中开辟了一个数组空间,只不过它的那个元素各自指向一个数组
下面我们来举个例子:

public class ArrayTest2{
		public static void main(String[] args){
			int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} };
			
			//这个是二维数组的长度
			System.out.println(arr1.length);
			
			//这个是二维数组中的某个元素所指向的数组的长度
			System.out.println(arr1[2].length);
		}
	}

        上面的代码中,我们定义了一个二维数组 arr1[ ][ ],并给它初始化了。就相当于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组。栈中定义了一个变量 arr1 ,存放的是该二维数组的地址,如下图所示。

详解Java中一维、二维数组在内存中的结构  

二维数组在内存中的表现形式

       可以看到我们定义的二维数组 arr1[3][0] 其实存放的都是各自元素所指向的元素的地址值。而在栈中存放的则是该数组的地址值。
好了,知道了二维数组在内存的结构,我们便可以知道下面两句代码的值:

//这个是二维数组的长度
			System.out.println(arr1.length);
			
			//这个是二维数组中的某个元素所指向的数组的长度
			System.out.println(arr1[2].length);
		}
	}

       其中 arr1.length 所指的就是二维数组的长度,那么二维数组的长度是多少呢?答案是 3 。而 arr1[2].length 所指的是该二维数组中第 3 个元素所指向的数组的长度,因此它的值是 4 。这两者的区别需要结合图细细体会。

到此这篇关于详解Java中一维、二维数组在内存中的结构的文章就介绍到这了,更多相关Java一维、二维数组内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
python文件拆分与重组实例
Dec 10 Python
python递归法解决棋盘分割问题
Jul 17 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
简单了解django文件下载方式
Feb 10 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
聊聊python中的异常嵌套
Sep 01 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
如何用python实现一个HTTP连接池
Jan 14 Python
SpringBoot首页设置解析(推荐)
Feb 11 #Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 #Python
详解python日志输出使用配置文件格式
Feb 10 #Python
python 获取域名到期时间的方法步骤
Feb 10 #Python
Numpy ndarray 多维数组对象的使用
Feb 10 #Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 #Python
python利用文件时间批量重命名照片和视频
Feb 09 #Python
You might like
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
Script的加载方法小结
2011/01/12 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
vue filters的使用详解
2018/06/11 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
利用python爬取散文网的文章实例教程
2017/06/18 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
python3 实现调用串口功能
2019/12/26 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
《蒲公英》教学反思
2014/02/28 职场文书
大学毕业生自我评价
2015/03/02 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
大学生实习证明
2015/06/16 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
部分武汉产收音机展览
2022/04/07 无线电