二维数组及其内存图解

二维数组

        在一维数组的介绍当中曾说,数组中可以储存任何同类型的元素,那么这个元素是不是可以也是数组呢?答案是可以,即在数组之中储存数组元素。这种情况就是多维数组,当一个数组中的元素是数组时叫做二维数组,当这个数组中的数组元素的元素仍然是数组时叫做三位数组,依次类推可以得到n维数组。不过通常的使用中一般只用到二位数组。

        二维数组的定义与一位数组的定义相似,可以通过语句:

        1、数据类型 [ ] [ ] 数组名称 = new [一维数组的长度] [ ]; 

        2、数据类型  数组名称 [ ] [ ] = new [一维数组的长度] [ ];

        3、数据类型  [ ] [ ] = new 数据类型 [ ] [ ]{数组1,数组2,数组3,……};

        4、数据类型 [ ] [ ] ={ 数组1,数组2,数组3,……};

四个语句来定义,同样在这四个数组中,第2个语句是第一个语句的变体,第3个语句和第4个语句当中需要注意输入的是数组元素即可,并且这里要注意的是,在第1个语句和第2个语句中“一维数组的长度”是必不可少的,但是第二个[ ]中是不能添加长度的。

        对于二位数组的访问,可以访问其中的某一个数组,也可访问到具体单个元素,比如在二维数组中arr[0]表示的是一个数组,当进行输出打印时,结果是一个一维数组,而arr[0][0]表示的是在二维数组中的第一行的第一个元素。掌握了这个访问规则,就可以对二维数组中的元素进行遍历,可以直接进行遍历,也可以采用嵌套循环来遍历。比如下面的这个程序所示:

package cn.luoyusanshu.array;
import java.util.Arrays;
public class Test05 {
    public static void main(String[] args) {
        //第1个语句创建二维数组
        int[][] arr01 = new int[3][];
        arr01[0] =new int[] {1,5,6};
        arr01[1] = new int[] {1,5,8,7};
        arr01[2] = new int[] {4,9,66};

        //第2个语句创建二位数组
        int arr02[][]=new int[3][];
        arr02[0] = new int[]{1,6,8,9};
        arr02[1] = new int[]{8,69,8,9};
        arr02[2] = new int[]{5,6,8,79};

        //第3个语句创建二维数组
        int[][] arr03 = new int[][]{{1,2,9},arr02[1],arr02[2]};

        //第4个语句创建二维数组
        int[][] arr04 = {{0,2,5},{3,6,9,6},{4,8,11,22}};

        //访问二维数组中的元素
        System.out.println("二维数组arr0的第一个数组元素为:"+Arrays.toString(arr01[0]));
        System.out.println("二维数组arr01的第一个元素为:"+arr01[0][0]);
        System.out.println("二维数组arr01的长度为:"+arr01.length);
        System.out.println("二维数组arr01的第一个数组元素的长度为:"+arr01[0].length);

    }


}

数组的内存图解

        在java中将内存分为栈、堆、方法区三大块,其中方法区用来储存可运行的class文件,包括方法、静态成员、常量等;栈是方法运行时的内存,也就说在运行方法时才会调用此处内存,在栈中开辟空间时是连续开辟的,和电影胶带有些相似,因此运行时开辟的空间叫这个方法在栈中对应的栈帧。栈的特点是“先进后出”,比如main方法是最先开辟栈帧的方法,但是它却是最后一个退出栈空间的方法。推内存够用于储存对象以及数组。数组在推内存中被储存时用来接收数组的变量(如arr)接收的是数组所在内存的地址值,而不是数组中元素的实际值,因此数组是引类型,如果要对一个数组进行初始化,要用null关键字进行赋值。

        接下来用一个程序来分析二维数组在内存中的储存进行分析,用以加深对数组也是对象的理解。

package cn.luoyusanshu.array;

public class Test08 {
    public static void main(String[] args) {
       int[][] arr = new int[3][];
       arr[0]=new int[2];
       arr[1]=new int[3];
       arr[2]=new int[2];
    }
}

        在这个程序的内存分析中只用到了 栈内存和堆内存两块,程序开始时,从main方法开始运行,创建数组之前先在main方法的栈帧中创建了一个变量,由于未进行赋值,它的值为默认值,因为创建的是数组,所以它的默认值为null。随后遇到关键字new,于是想堆内存申请开辟空间,假设这个空间的地址为0x0011,这时会按照创建的数组大小在推内存中开辟相应的空间,并将空间的地址传给arr变量。但由于创建数组时并未进行赋值操作,为默认初始化,所以数组元素的值为默认值,又因为二维数组中的元素为数组类型,因此此时的默认值为null。

        接下来对数组中的元素进行赋值操作,在下面的三行代码都采用了new关键字,因此会向推内存申请开辟三个空间,与这三个空间对应的地址分别为 0x0021、0x0031、0x0022。由于创建的为int类型的数组对象,并且未进行赋值操作,因此元素的值为默认值0。同时开辟的这三个空间的地址会返回给对应的一位数组对应的元素,如下图所示。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/527831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用校园网——Win10笔记本,台式机互开热点

当我们使用校园网的时候,往往只能连接一个电脑端,但是又想两个机子同时连接WIFI怎么办呢? 当然,前提条件是你先得其中一台电脑有网络哈 1、打开想开共享热点的电脑的设置 A、点击WIN,再点击设置 2、点击网络和Inte…

论如何在小程序展示超链接在线网页

在工作中遇到一个需求&#xff0c;就是在小程序中展示超链接网页&#xff0c;起初我是直接使用web-view标签 <web-view src"https://www.baidu.com/"/>但是web-view只能在开发阶段手机上展示&#xff0c;一旦小程序发布线上&#xff0c;就会出现下面这种情况“…

每日OJ题_两个数组dp④_力扣44. 通配符匹配

目录 力扣44. 通配符匹配 解析代码 力扣44. 通配符匹配 44. 通配符匹配 难度 困难 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包…

如果用大模型考公,kimi、通义千问谁能考高分?

都说大模型要超越人类了&#xff0c;今天就试试让kimi和通义千问做公务员考试题目&#xff0c;谁能考高分&#xff1f; 测评结果再次让人震惊&#xff01; 问题提干&#xff1a;大小两种规格的盒装鸡蛋&#xff0c;大盒装23个&#xff0c;小盒装16个&#xff0c;采购员小王买了…

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别&#xff1f;2. ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?&#xff08;了解即可&#xff09;5. ArrayList 可以添加 null 值吗…

ts中的类型简介

注意&#xff1a;尽量不要在ts中用var&#xff0c;不然后续维护代码&#xff0c;容易出现很多问题。 var定义会在全局中生效&#xff0c;而let只会在作用域中起作用。 boolean string number array tuple&#xff08;元组&#xff09; enum&#xff08;枚举&#xff09; null u…

自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器

自动驾驶中的传感器融合算法&#xff1a;卡尔曼滤波器和扩展卡尔曼滤波器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 介绍&#xff1a; 追踪静止和移动的目标是自动驾驶技术领域最为需要的核心技术之一。来源于多种传感器的信号&#xff0c;包括摄像头&#xff0c;雷达…

想进阶为 Go 语言高级开发工程师吗?那么,一定要阅读此文!

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家&#xff1b;《企业级Go项目开发实战》作者&#xff0c;云原生实战营 知识星球星主&#xff1b; 我们知道&#xff0c;Go 出自名门 Google 公司&#xff0c;是一门支持并发、垃圾回收的编…

绝地求生:齐贺PUBG七周年!分享你的游玩感受及反馈赢惊喜道具

PUBG七周年庆典火热进行中&#xff0c;特殊道具、周年主题艾伦格上线&#xff01;七周年期间游玩PUBG&#xff0c;在评论区分享你的游玩感受及反馈&#xff0c;即可参与活动赢取夏日浪潮宝箱奖励。 参与方式 齐贺PUBG七周年&#xff01;在评论区分享分享你的七周年游玩感受及反…

(学习日记)2024.04.09:UCOSIII第三十七节:事件函数接口

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

stable diffusion的从安装到使用

stable-diffusion&#xff0c;一个免费开源的文生图软件&#xff0c;文章主要讲怎么从源码开始安装&#xff0c;以及使用的方式 git地址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui 本人电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前…

基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 正常图像&#xff1a; checkb位于f192b和f250b之间 多度曝光图像&#xff1a; checkb位于f192b和f250b之外&#xff0c;判决为曝光过度。 2.算法…

k8s_入门_kubelet安装

安装 在大致了解了一些k8s的基本概念之后&#xff0c;我们实际部署一个k8s集群&#xff0c;做进一步的了解 1. 裸机安装 采用三台机器&#xff0c;一台机器为Master&#xff08;控制面板组件&#xff09;两台机器为Node&#xff08;工作节点&#xff09; 机器的准备有两种方式…

【神经网络】卷积神经网络CNN

卷积神经网络 欢迎访问Blog全部目录&#xff01; 文章目录 卷积神经网络1. 神经网络概览2.CNN&#xff08;Convolutional Neunal Network&#xff09;2.1.学习链接2.2.CNN结构2.2.1.基本结构2.2.1.1输入层2.2.1.2.卷积层|Convolution Layers2.2.1.3.池化层|Pooling layers2.3…

设计模式——2_8 策略(Strategy)

文章目录 定义图纸一个例子&#xff1a;如何切换坦克的攻击方式GameElement&#xff08;游戏元素&#xff09;TankFactory&#xff08;坦克工厂&#xff09;Tank&#xff08;坦克&#xff09; 医疗车和飞行车策略模式Behavior(行为)TankTankFactory 碎碎念策略和状态为什么我们…

[数据结构]双向带头循环链表制作

前面我们有提到&#xff0c;单向不带头循环链表的制作 这里我们介绍一个双向带头循环链表的制作方法 双向带头循环链表的示意图如下 带头指针的作用体现在哪呢? 第一、防止头节点为空,既有头结点&#xff0c;头指针始终指向头结点&#xff0c;那么无论链表是否为空&#xf…

游戏公司面试题系列-CocosCreator实现虚拟摇杆控制角色移动中心旋转自转小球割草旋转逻辑

游戏公司面试题系列-CocosCreator实现虚拟摇杆控制角色移动&中心旋转自转小球&割草旋转逻辑<&#xff01;&#xff01;&#xff01;文章末尾有完整代码下载链接地址&#xff01;&#xff01;&#xff01;> Hello大家好&#xff01;今天我们来用最新的CocosCreat…

pringboot2集成swagger2出现guava的FluentIterable方法不存在

错误信息 Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:117) The following method did not ex…

PHP运算符与流程控制

华子目录 运算符赋值运算符算术运算符比较运算符逻辑运算符连接运算符错误抑制符三目运算符自操作运算符 计算机码位运算符 运算符优先级流程控制控制分类顺序结构分支结构if分支switch分支 循环结构for循环while循环continuebreak 运算符 运算符&#xff1a;operator&#xf…

谷歌留痕霸屏要怎么做?

谷歌留痕霸屏&#xff0c;就是让你的网站或者页面在谷歌搜索结果里尽可能多地出现&#xff0c;就像是在你的潜在客户眼前留下深刻印象一样&#xff0c;你要做的就是在一些高权重平台发布有价值的信息&#xff0c;同时巧妙地留下你的品牌名、产品名或者任何你想要推广的关键词&a…