Java:二维数组
目录
1. 二维数组的基础格式
1.1 二维数组变量的创建 —— 3种形式
1.2 二维数组的初始化
\1 动态初始化
\2 静态初始化
2. 二维数组的大小 和 内存分配
3. 二维数组的不规则初始化
4. 遍历二维数组
4.1 for循环
编辑
4.2 for-each循环
5. 二维数组 与 方法
5.1 二维数组的数据类型
5.2 二维数组作为方法参数
5.3 二维数组作为返回值
6. 二维数组转字符串deepToString
1. 二维数组的基础格式
1.1 二维数组变量的创建 —— 3种形式
创建格式:
- 数据类型[ ][ ] 数组名; //是最常用和推荐的写法
- 数据类型[ ] 数组名[ ]; //不推荐
- 数据类型 数组名[ ][ ]; //类似C语言的写法
例如:(后面才讲解创建对象和初始化,所以目前都用空引用null来给数组赋值。)
- int[ ][ ] arr1 = null;
- int[ ] arr2[ ] = null;
- int arr3[ ][ ] = null;
int[][] arr
、int[] arr[]
和int arr[][]
这三种声明方式实际上都是等价的,它们都表示一个二维整数数组。
1.2 二维数组的初始化
\1 动态初始化
基础格式:
类型[ ][ ] 数组名 = new 类型[k1][k2]; //系统会用默认值给所有元素赋值
(其实动态初始化还包括不规则初始化,这个留到后面讲解)
例如:
int[][] arr = new int[3][4]; //创建了3X4的整型二维数组
注意:等号左边的两个方括号不能写数字。
\2 静态初始化
1.完全形式:
类型[ ][ ] 数组名 = new 类型[ ][ ] = { {第1行},{第2行},…,{第n行} };
2.省略形式:
类型[ ][ ] 数组名 = { {第1行},{第2行},…,{第n行} };
例如:
int[][] arr1 = new int[][]{{1, 2 },{4, 5, 6,3},{7, 8, 9}};int[][] arr2 = {{1, 2 },{4, 5, 6,3},{7, 8, 9}};
【注意事项】
- 在静态初始化时,必须要有双重大括号{},否则会报错。【C语言是可以单重大括号的】
其他注意事项和一维数组类似,详细可看《Java:数组的定义和使用(万字解析)》
2. 二维数组的大小 和 内存分配
现在我们有一个3X4的整型数组,我们用.length的方式能否拿到该二维数组的长度:
public static void main(String[] args) {int[][] arr = new int[3][4];System.out.println("长度为:"+ arr.length);}
输出:
打印结果是3。为什么arr的长度是3,而不是12 ?
要回答这个问题我们就需要弄清楚Java中二维数组的内存分配。
二维数组的内存分配:
- 在Java中,二维数组实际上是一个数组的数组。
- 二维数组的内存是部分连续的,分为外层数组和内层数组。
- 内存数组变量之间是连续的(即外层数组连续),内存数组之间是不连续的。
以刚刚的3X4的整型数组为例:
外层数组是arr,内层数组和内层数组变量是:arr[0]、arr[1]、arr[2]。
arr[0]、arr[1]、arr[2]是arr的3个元素,它们是连续的,所以arr.length等于3。
每个内层数组内部是连续的:例如arr[0],从arr[0][0]到arr[0][3]都是连续的。
但每个内层数组之间是不连续的。
【C语言中的二维数组是完全连续,所以可依靠列数来反推行数(可以省略行);而Java中的二维数组更像是C语言中数组指针数组,即数组中的每个元素都是一个数组指针】
3. 二维数组的不规则初始化
数组指针数组中,每个数组指针的大小是不固定的;所以类似的,Java中的二维数组不能省略行,但是列可以省。(数组指针所指向的数组大小可以不知道)
不规则初始化:
类型[ ][ ] 数组名 = new 类型[k][ ];
注意:
- 不规则初始化只能省略列,不能省略行。
- 不规则初始化也是一种动态初始化,但是这样只为外层数组创建了对象,而内层数组还没创建对象(目前内层数组变量的值是null)。
以不规则初始化创建二维数组的格式: (大小是k1 X k2)
类型[ ][ ] 数组名 = new 类型[k1][ ];
for(int i = 0; i < 数组名.length; i++){
数组名[i] = new 类型[k2];
}
例如:创建整型二维数组,大小是3X4
int[][] arr = new int[3][];
for(int i = 0; i < arr.length; i++){arr[i] = new int[4];
}
4. 遍历二维数组
二维数组的遍历也有for循环和for-each循环
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
以该数组arr为例:
4.1 for循环
先取外层数组的长度(行数),再取内层数组的长度(列数)。
for(int i = 0; i < arr.length; i++){for(int j = 0; j < arr[i].length; j++){System.out.print(arr[i][j]+" ");}System.out.println();
}
4.2 for-each循环
行数变量x1的类型是一维数组类型,列数变量x2的类型是元素类型。
for(int[] x1: arr){for(int x2: x1){System.out.print(x2+" ");}System.out.println();
}
5. 二维数组 与 方法
5.1 二维数组的数据类型
数组的数据类型是“ 元素类型[ ][ ] ”。
例如:int[][] arr = new int[3][3];
该数组arr的数据类型是int[ ][ ]。不是int[3][3],不是int[3][ ],也不是int[3]。
【如果在C语言中,该数组arr的数据类型是int[3][3]】
5.2 二维数组作为方法参数
你可以将一个二维数组作为参数传递给方法。例如:
public static void printArray(int[][] array) {for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j] + " ");}System.out.println();}}
二维数组传递的也是地址。
Java中的二维数组形参是一个“真二维数组”。而C语言中的二维数组形参的本质是指针,而且是行指针(不是二级指针,也不是数组指针)。
5.3 二维数组作为返回值
你也可以从方法中返回一个二维数组。例如:
public static int[][] createArray(int rows, int cols) {int[][] array = new int[rows][cols];int value = 1;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {array[i][j] = value++;}}return array;}
6. 二维数组转字符串deepToString
我们看一下,用toString方法能不能把二维数组打印出来:
public static void main(String[] args) {int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};System.out.println(arr.toString());System.out.println(Arrays.toString(arr));}
输出:
可以发现,无论是arr.toString还是Arrays.toString(arr),toString方法不能把二维数组转为字符串。那应该怎么办呢?
Arrays工具类提供了方法deepToString,它可以让我们深层次地把二维数组转成字符串。
注意:数组自身只有toString方法,没有deepToString方法。
例如:
public static void main(String[] args) {int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};System.out.println(Arrays.deepToString(arr));}
输出;
本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ
相关文章:

Java:二维数组
目录 1. 二维数组的基础格式 1.1 二维数组变量的创建 —— 3种形式 1.2 二维数组的初始化 \1 动态初始化 \2 静态初始化 2. 二维数组的大小 和 内存分配 3. 二维数组的不规则初始化 4. 遍历二维数组 4.1 for循环 编辑 4.2 for-each循环 5. 二维数组 与 方法 5.1…...

Android 天气APP(三十七)新版AS编译、更新镜像源、仓库源、修复部分BUG
上一篇:Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife 新版AS编译、更新镜像源、仓库源、修复部分BUG 前言正文一、更新镜像源① 腾讯源③ 阿里源 二、更新仓库源三、修复城市重名BUG四、地图加载问题五、源码 前…...

Xilinx IP核(3)XADC IP核
文章目录 1. XADC介绍2.输入要求3.输出4.XADC IP核使用5.传送门 1. XADC介绍 xadc在 所有的7系列器件上都有支持,通过将高质量模拟模块与可编程逻辑的灵活性相结合,可以为各种应用打造定制的模拟接口,XADC 包括双 12 位、每秒 1 兆样本 (MSP…...

计算机网络socket编程(2)_UDP网络编程实现网络字典
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨…...

c#窗体列表框(combobox)应用——省市区列表选择实例
效果如下: designer.cs代码如下: using System.Collections.Generic;namespace 删除 {public partial class 省市区选择{private Dictionary<string, List<string>> provinceCityDictionary;private Dictionary<string,List<string&…...

Nginx 架构与设计
Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也可以用作邮件代理和通用的 TCP/UDP 负载均衡器。它的架构设计以高并发、高可扩展性和高性能为目标,充分利用操作系统提供的多路复用机制和事件驱动模型。以下是 Nginx 的架构和设计特点: 1…...

python Flask指定IP和端口
from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)...

多线程 相关面试集锦
什么是线程? 1、线程是操作系统能够进⾏运算调度的最⼩单位,它被包含在进程之中,是进程中的实际运作单位,可以使⽤多线程对 进⾏运算提速。 ⽐如,如果⼀个线程完成⼀个任务要100毫秒,那么⽤⼗个线程完成改…...

【数据结构】—— 线索二叉树
引入 我们现在提倡节约型杜会, 一切都应该节约为本。对待我们的程序当然也不例外,能不浪费的时间或空间,都应该考虑节省。我们再观察团下图的二叉树(链式存储结构),会发现指针域并不是都充分的利用了,有许…...

uni-app 发布媒介功能(自由选择媒介类型的内容) 设计
1.首先明确需求 我想做一个可以选择媒介的内容,来进行发布媒介的功能 (媒介包含:图片、文本、视频) 2.原型设计 发布-编辑界面 通过点击下方的加号,可以自由选择添加的媒介类型 但是因为预览中无法看到视频的效果&…...

How to update the content of one column in Mysql
How to update the content of one column in Mysql by another column name? UPDATE egg.eggs_record SET sold 2024-11-21 WHERE id 3 OR id 4;UPDATE egg.eggs_record SET egg_name duck egg WHERE id 2;...

URL在线编码解码- 加菲工具
URL在线编码解码 打开网站 加菲工具 选择“URL编码解码” 输入需要编码/解码的内容,点击“编码”/“解码”按钮 编码: 解码: 复制已经编码/解码后的内容。...

Python3 爬虫 Scrapy的安装
Scrapy是基于Python的分布式爬虫框架。使用它可以非常方便地实现分布式爬虫。Scrapy高度灵活,能够实现功能的自由拓展,让爬虫可以应对各种网站情况。同时,Scrapy封装了爬虫的很多实现细节,所以可以让开发者把更多的精力放在数据的…...

QT中QString类的各种使用
大部分的QString使用可以参考:QT中QString 类的使用--获取指定字符位置、截取子字符串等_qstring 取子串-CSDN博客 补充一种QString类的分离:Qt QString切割(Split()与Mid()函数详解)_qstring split-CSDN博客 1. Trimmed和Simplified函数(去除空白) trimmed:去除了…...

linux 网络安全不完全笔记
一、安装Centos 二、Linux网络网络环境设置 a.配置linux与客户机相连通 b.配置linux上网 三、Yum详解 yum 的基本操作 a.使用 yum 安装新软件 yum install –y Software b.使用 yum 更新软件 yum update –y Software c.使用 yum 移除软件 yum remove –y Software d.使用 yum …...

uniapp将图片url转换成base64支持app和h5
uniapp将图片url转换成base64支持app和h5 imageToBase64支持app和h5, app内使用plus.io.resolveLocalFileSystemURL方法转换 h5内使用uni.request方法转换 // 图片转base64 export const imageToBase64 (path) > {// #ifdef APP-PLUSreturn new Promise((resolve, rejec…...

odoo17 档案管理之翻译2
翻译格式:#: model_terms:对象名称,arch_db:模块名.xml_id #. module: dms #: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban #: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban #: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_…...

风尚云网前端学习:制作一款简易的在线计算器
风尚云网前端学习:制作一款简易的在线计算器 简介 在前端开发的学习过程中,实现一个简单的在线计算器是一个常见的练习项目。它不仅能够帮助我们熟悉HTML、CSS和JavaScript的基本用法,还能够加深我们对事件处理和DOM操作的理解。今天&#…...

Android蓝牙架构,源文件目录/编译方式学习
Android 版本 发布时间 代号(Codename) Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…...

ubuntu中使用ffmpeg和nginx推流rtmp视频
最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …...

strongswan测试流程
测试shell脚本文件testing/do-tests,测试配置文件testing/testing.conf。do-tests脚本不加参数,将依次执行testing/tests/目录下的所有测试用例。do-tests脚本有两个参数-v和-t,前者在测试中记录详细信息,后者在输出信息中增加时间…...

[CKS] CIS基准测试,修复kubelet和etcd不安全项
目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 专栏其他文章: [CKS] K8S Admission Set Up[CKS] CIS基准测试,修复kubelet和etcd不安全项[CKS] K8S NetworkPolicy Set Up[CKS] 利用Trivy对image进行扫描[CKS] 利用falco进行容器…...

Linux/Windows/OSX 上面应用程序重新启动运行。
1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…...

React拆分组件中的传值问题
在我们实际项目开发中,很多时候为为了项目后期便于维护,都会将相关的组件进行拆分,拆分过后,会将数据方法在父组件中进行编写,然后将一些逻辑拆分为组件,在这个过程中,最重要的就是数据的传递&a…...

RocketMQ的使⽤
初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种⽅式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要⻢上回复。 两种⽅式各有优劣,打电话可以⽴即得到响应,但…...

Android Studio 设置不显示 build-tool 无法下载
2024版本查看build-tool版本 File -> Settings -> Languages & Frameworks -> Android SDK 或者直接打开Settings后搜索“SDK” 解决方案 将 Android Studio 升级到2022.2.1以上的版本将 C:/Windows/System32/drivers/etc/hosts 文件用管理员身份打开,…...

【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)
网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升,垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施,提升公众的环保意识和参与度,垃圾分类已…...

细说敏捷:敏捷四会之standup meeting
上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动࿰…...

ThinkPHP8使用workerman
应用场景说明:通过建立通信,不同用户进行消息推送或数据更新,因为本身需要作为服务端进行主动消息推送,因此使用Gateway方式,如果不需要的可以不采用这种形式,以下内容仅为参考,具体业务场景&am…...

C语言超详细教程
系列文章目录 文章目录 系列文章目录1 运算符1.1 算术运算符:2 控制语句2.1 条件语句:2.2 循环语句:3 函数3.1 函数的定义与声明:3.2 递归函数:4 指针4.1 指针的定义与使用函数指针:5. 数组与字符串5.1 数组一维数组:相同类型元素的集合(如:多维数组:数组的数组(如:…...