详解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实现的百度站长自动URL提交小工具
Jun 27 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
如何运行带参数的python脚本
Nov 15 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Django中和时区相关的安全问题详解
Oct 12 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 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数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
Python元字符的用法实例解析
2018/01/17 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Flask之flask-session的具体使用
2018/07/26 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
青年教师个人总结
2015/02/11 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年大学生工作总结
2015/04/21 职场文书
工作简历的自我评价
2019/05/16 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL