学习
实践
活动
工具
TVP
写文章

你知道吗?其实从底层的运行机制来看是没有二维数组的

写在前面:

相信很多编程小白在开始接触数组的时候都有那么一丢丢的小痛苦,一般都是通过字面意思+想象力在自己脑中刻画出一个数组,这个真的有点难为人了,我就把我最近学习到的数组内存解析分享给大家,从底层去了解数组到底是个什么东西!!

数组的定义和相关属性

数组的定义:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

数组相关的属性:数组名、元素、(角标、下标、索引)、数组的长度

记住数组的一些结论

数组是有序排列的

数组属于引用数据类型的变量。数组的元素,既可以是基 本数据类型,也可以是引用数据类型

创建数组对象会在内存中开辟一整块连续的空间

数组的长度一旦确定,就不能修改。

了解堆和栈的区别

编译完源程序以后,生成一个或多个字节码文件,然后使用JVM中类的加载器和解释器对生成的字节码文件进行解释运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。

栈:虚拟机栈即为平时提到的栈结构,将局部变量存储在栈结构中。本地方法栈和虚拟机栈是两个不同的东西。

堆:将new出来的结构(比如:数组、对象)加载在堆空间中。补充一下:对象的属性(非static的)也加载在堆空间中。

一维数组内存结构

内存结构1

在创建一个数组时,以等号为中心,分开左右两部分,左边是一个int 型的局部变量,所以存放到相应的栈空间,右边是使用new关键字创建的结构,所以存放在堆空间中。在没有赋值的情况下,int 的默认值是0,arr变量存放的就是数组的首地址,依靠这个首地址就可以找到堆中相应的数组元素。

内存结构2

赋值的过程就是通过首地址和索引找到相应的元素,给它赋予一个值就行。注意一句话:数组属于引用数据类型的变量,数组的元素,既可以是基本数据类型,也可以是引用数据类型。

也就是说可以给数组元素赋引用类型的数据,那你现在应该能猜到二维数组是怎么产生的吧?

二维数组内存结构

内存结构1

创建一个4行0列的数组,把地址给到栈空间的的arr1变量,此时没有列数,说明没有给二维数组赋值,所以arr1[0]、arr1[1]、arr1[2]、arr1[3] 的值都为null。

在这里可能有点懵了,声明的二维数组是int 型,默认值应该是0,为什么这里是null?还是那句话,数组是本身是引用类型,数组的元素可以是引用类型也可以是基本数据类型,这里是null的原因是它存放的元素是一个一维数组,也就是引用类型(地址值),所以没有初始化时,元素的值是null而不是0。int型指的的最后存放的数组元素类型。

为arr1[1]赋值一个静态初始化的数组,把地址给到arr1[1]。

为arr1[2]赋值一个没有初始化的数组,元素默认是0,把地址给到arr1[2]。

为arr1[2]所指向的一维数组的第一个元素赋值。

总结:对于二维数组的理解,可以看成是一维数组 array1又作为另一个一维数组array2的元素而存 在。其实,从数组底层的运行机制来看,其实没有二维数组或者多维数组的说法。

空指针异常的原因:

我们创建数组时如果只是指定了行数,就相当于只创建了一个引用类型的一维数组,所以这条语句会输出null,而此时语句就会报空指针异常的错误。

原因:a引用并没有指向任何实体,却操作实体的元素,根本无法找到该元素。

好了,今天就分享到这里,如果你喜欢这篇文章的话,请转发出去。如果你不喜欢这篇文章的话,请你先喜欢上这篇文章再转发出去,然后顺手点一个赞。谢谢!

如今是资源泛滥的互联网的时代,如果你不想花时间去收集和整理你需要的一些资料,那就进来我的知识星球吧,星球中已经收录了很多csdn下载的资料、视频教程、源代码、工程文件、资料手册、课程设计等等,总会有适合你哒。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200215A04ES100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

扫码关注腾讯云开发者

领取腾讯云代金券