首页 > python教程

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

时间:2021-04-05 python教程 查看: 817

前言

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

1、内存中的简化结构

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

 内存的简单结构

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 自动回收。这就是一维数组在内存中的表现形式。那么二维数组在内存中又是如何表示的呢?

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

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 ,存放的是该二维数组的地址,如下图所示。

  

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

       可以看到我们定义的二维数组 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博客!

展开全文
上一篇:Python LMDB库的使用示例
下一篇:requests在python中发送请求的实例讲解
输入字:
相关知识
Python 实现图片色彩转换案例

我们在看动漫、影视作品中,当人物在回忆过程中,体现出来的画面一般都是黑白或者褐色的。本文将提供将图片色彩转为黑白或者褐色风格的案例详解,感兴趣的小伙伴可以了解一下。

python初学定义函数

这篇文章主要为大家介绍了python的定义函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助

图文详解Python如何导入自己编写的py文件

有时候自己写了一个py文件,想要把它导入到另一个py文件里面,所以下面这篇文章主要给大家介绍了关于Python如何导入自己编写的py文件的相关资料,需要的朋友可以参考下

python二分法查找实例代码

二分算法是一种效率比较高的查找算法,其输入的是一个有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否则返回NONE,下面这篇文章主要给大家介绍了关于python二分法查找的相关资料,需要的朋友可以参考下