详解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 相关文章推荐
跟老齐学Python之编写类之三子类
Oct 11 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
简单谈谈python中的语句和语法
Aug 10 Python
Python+pandas计算数据相关系数的实例
Jul 03 Python
python后端接收前端回传的文件方法
Jan 02 Python
Django Rest framework权限的详细用法
Jul 25 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
Php header()函数语法及使用代码
2013/11/04 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
什么是Python变量作用域
2020/06/03 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
九年级科学教学反思
2014/01/29 职场文书
护士的自我鉴定
2014/02/07 职场文书
公务员诚信承诺书
2014/05/26 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
中队活动总结
2014/08/27 职场文书
护士自荐信怎么写
2015/03/06 职场文书
关于倡议书的范文
2015/04/29 职场文书