• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
两个小胖猪遗 显示全部楼层 发表于 2021-10-25 18:41:27 |阅读模式 打印 上一主题 下一主题
前言

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

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

内存的简单结构
2、一维数组

       下面我们来通过代码相识一下,一维数组在内存中的表现形式。我们先界说一个ArrayTest类。
  1. public class ArrayTest{
  2.                 public static void main(String[] args){
  3.                         //定义三个数组 a[]、b[]、c[]
  4.                         int[] a = new int[]{1,2,3};
  5.                         float[] b = new float[3];
  6.                         String[] c = new String[4];
  7.                        
  8.                         //给特定元素赋值
  9.                         c[1] = "张三";
  10.                         c[2] = "李四";
  11.                        
  12.                         //改变变量指向
  13.                         c = new String[2];
  14.                 }
  15.         }
复制代码
      上面的代码中,我们界说了三个数组 a[ ]、b[ ]、c[ ] 就相称于 在堆开辟了三个各自连续的空间作为数组,如果指定了数组元素的值,则存放的是各个指定的值。如果没有指定,则存放的是默认该数组类型的初始化值,如 b[ ] 。然后会 在栈里依次界说三个变量 a、b、c ,三个变量存放的是各自对应的数组的所在值,如 a 存放的是 0x1234,而堆里该数组的所在是 0x11234 。
       给元素赋值的话就相称于用我们指定的值覆盖原有的值。下面我们来重点看一下这一句:
  1. c = new String[2];
复制代码
     本来栈中的 c 变量存放的所在是 0x12ab 的,指向绿色的数组,但是我们 利用了这句话就相称于在堆中又重新开辟了一个数组,并将这个数组的所在赋给了变量 c ,也就是说** c 这个时间的指向变量,不再指向原来的数组了,而是指向了新的数组**。而没有变量指向的原有数组会被 Java 主动接纳。这就是一维数组在内存中的表现形式。那么二维数组在内存中又是怎样表现的呢?

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

       其实 在底层中并没有二维数组这个概念,我们知道数组是引用数据类型,其元素值可以是基本数据类型,又可以是引用数据类型。所谓的 二维数组其实就相称于我们在内存中开辟了一个数组空间,只不外它的那个元素各自指向一个数组
下面我们来举个例子:
  1. public class ArrayTest2{
  2.                 public static void main(String[] args){
  3.                         int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} };
  4.                        
  5.                         //这个是二维数组的长度
  6.                         System.out.println(arr1.length);
  7.                        
  8.                         //这个是二维数组中的某个元素所指向的数组的长度
  9.                         System.out.println(arr1[2].length);
  10.                 }
  11.         }
复制代码
       上面的代码中,我们界说了一个二维数组 arr1[ ][ ],并给它初始化了。就相称于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组。栈中界说了一个变量 arr1 ,存放的是该二维数组的所在,如下图所示。
  

二维数组在内存中的表现形式
       可以看到我们界说的二维数组 arr1[3][0] 其实存放的都是各自元素所指向的元素的所在值。而在栈中存放的则是该数组的所在值。
好了,知道了二维数组在内存的结构,我们便可以知道下面两句代码的值:
  1.         //这个是二维数组的长度
  2.                         System.out.println(arr1.length);
  3.                        
  4.                         //这个是二维数组中的某个元素所指向的数组的长度
  5.                         System.out.println(arr1[2].length);
  6.                 }
  7.         }
复制代码
      其中 arr1.length 所指的就是二维数组的长度,那么二维数组的长度是多少呢?答案是 3 。而 arr1[2].length 所指的是该二维数组中第 3 个元素所指向的数组的长度,因此它的值是 4 。这两者的区别需要联合图细细体会。
到此这篇关于详解Java中一维、二维数组在内存中的结构的文章就介绍到这了,更多相关Java一维、二维数组内容请搜刮草根技术分享以前的文章或继承欣赏下面的相关文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作