精講:java之多維數組的使用

一、多維數組簡介

1.為什么需要二維數組

我們看下面這個例子?“

????????某公司2022年全年各個月份的銷售額進行登記。按月份存儲,可以使用一維數組。如果改寫為按季度為單位存儲怎么辦呢?

????????或許現在學習了一維數組的你只能申請四個一維數組去存儲每個季度的銷售額吧?和一一維數組的思想一樣,能不能有一個容器將這四個一維數組裝起來然后提供一個統一的變量名供我們使用呢?答案是肯定的。我們在學習一維數組的時候也學到,數組的元素可以是基本數據類型也可以是引用數據類型,而數組本身就是引用數據類型。所以可以將數組作為數組的元素,這就是多維數組。

例如:

按月份int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66};
按季度int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}};

總結:

  • 對于二維數組的理解,可以看成是一維數組array1又作為另一個一維數組array2的元素而存在。

  • 其實,從數組底層的運行機制來看,其實沒有多維數組。

二、二維數組的聲明與初始化

1.二維數組的聲明

語法格式

//推薦
元素的數據類型[][] 二維數組的名稱;

//不推薦(但可行)
元素的數據類型 ?二維數組名[][];
//不推薦(但可行)
元素的數據類型[] ?二維數組名[];

舉例

public class Test20TwoDimensionalArrayDefine {
? ? public static void main(String[] args) {
? ? ? ? //存儲多組成績
? ? ? ? int[][] grades;

? ? ? ? //存儲多組姓名
? ? ? ? String[][] names;

????????int[] x, y[];//x是一維數組,y是二維數組
? ? }
}

2.二維數組的靜態初始化

格式int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
舉例

int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}};//聲明與初始化必須在一句完成(類型推斷)

int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

int[][] arr;
arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}};

arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9,10}};//錯誤,靜態初始化右邊new 數據類型[][]中不能寫數字

注意:二維數組也有length屬性。例如:arr.length;與 arr[2].length;

3.二維數組的動態初始化

a)使用場景

如果二維數組的每一個數據,甚至是每一行的列數,需要后期單獨確定,那么就只能使用動態初始化方式了。動態初始化方式分為兩種格式。

b)格式一:規則二維表(每一行的列數是相同的)

格式

//(1)確定行數和列數
元素的數據類型[][] 二維數組名 = new 元素的數據類型[m][n];
?? ?//其中,m:表示這個二維數組有多少個一維數組。或者說一共二維表有幾行
?? ?//其中,n:表示每一個一維數組的元素有多少個。或者說每一行共有一個單元格

//此時創建完數組,行數、列數確定,而且元素也都有默認值

//(2)再為元素賦新值
二維數組名[行下標][列下標] = 值;

舉例

int[][] arr = new int[3][2];

  • 定義了名稱為arr的二維數組

  • 二維數組中有3個一維數組

  • 每一個一維數組中有2個元素

  • 一維數組的名稱分別為arr[0], arr[1], arr[2]

  • 給第一個一維數組1腳標位賦值為78寫法是:arr[0][1] = 78;

c)格式二:不規則二維表(每一行的列數不一樣)

格式

//(1)先確定總行數
元素的數據類型[][] 二維數組名 = new 元素的數據類型[總行數][];

//此時只是確定了總行數,每一行里面現在是null

//(2)再確定每一行的列數,創建每一行的一維數組
二維數組名[行下標] = new 元素的數據類型[該行的總列數];

//此時已經new完的行的元素就有默認值了,沒有new的行還是null

//(3)再為元素賦值
二維數組名[行下標][列下標] = 值;

舉例

int[][] arr = new int[3][];

  • 二維數組中有3個一維數組。

  • 每個一維數組都是默認初始化值null (注意:區別于格式1)

  • 可以對這個三個一維數組分別進行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

  • 注:int[][]arr = new int[][3]; //非法

4.數組的長度和角標

說明

  • 二維數組的長度/行數:二維數組名.length

  • 二維數組的某一行:二維數組名[行下標],此時相當于獲取其中一組數據。它本質上是一個一維數組。行下標的范圍:[0, 二維數組名.length-1]。此時把二維數組看成一維數組的話,元素是行對象。

  • 某一行的列數:二維數組名[行下標].length,因為二維數組的每一行是一個一維數組。

  • 某一個元素:二維數組名[行下標][列下標],即先確定行/組,再確定列。

舉例

public class Test22TwoDimensionalArrayUse {
? ? public static void main(String[] args){
? ? ? ? //存儲3個小組的學員的成績,分開存儲,使用二維數組。
?? ??? ?/*
?? ??? ?int[][] scores1;
?? ??? ?int scores2[][];
?? ??? ?int[] scores3[];*/

? ? ? ? int[][] scores = {
? ? ? ? ? ? ? ? {85,96,85,75},
? ? ? ? ? ? ? ? {99,96,74,72,75},
? ? ? ? ? ? ? ? {52,42,56,75}
? ? ? ? };

? ? ? ? System.out.println(scores);//[[I@15db9742
? ? ? ? System.out.println("一共有" + scores.length +"組成績.");

? ? ? ? //[[:代表二維數組,I代表元素類型是int
? ? ? ? System.out.println(scores[0]);//[I@6d06d69c
? ? ? ? //[:代表一維數組,I代表元素類型是int
? ? ? ? System.out.println(scores[1]);//[I@7852e922
? ? ? ? System.out.println(scores[2]);//[I@4e25154f
? ? ? ? //System.out.println(scores[3]);//ArrayIndexOutOfBoundsException: 3

? ? ? ? System.out.println("第1組有" + scores[0].length +"個學員.");
? ? ? ? System.out.println("第2組有" + scores[1].length +"個學員.");
? ? ? ? System.out.println("第3組有" + scores[2].length +"個學員.");

? ? ? ? System.out.println("第1組的每一個學員成績如下:");
? ? ? ? //第一行的元素
? ? ? ? System.out.println(scores[0][0]);//85
? ? ? ? System.out.println(scores[0][1]);//96
? ? ? ? System.out.println(scores[0][2]);//85
? ? ? ? System.out.println(scores[0][3]);//75
? ? ? ? //System.out.println(scores[0][4]);//java.lang.ArrayIndexOutOfBoundsException: 4
? ? }
}

三、二維數組的遍歷

格式for(int i=0; i<二維數組名.length; i++){ //二維數組對象.length
? ? for(int j=0; j<二維數組名[i].length; j++){//二維數組行對象.length
? ? ? ? System.out.print(二維數組名[i][j]);
? ? }
? ? System.out.println();
}
舉例

public class Test23TwoDimensionalArrayIterate {
? ? public static void main(String[] args) {
? ? ? ? //存儲3個小組的學員的成績,分開存儲,使用二維數組。
? ? ? ? int[][] scores = {
? ? ? ? ? ? ? ? {85,96,85,75},
? ? ? ? ? ? ? ? {99,96,74,72,75},
? ? ? ? ? ? ? ? {52,42,56,75}
? ? ? ? };

? ? ? ? System.out.println("一共有" + scores.length +"組成績.");
? ? ? ? for (int i = 0; i < scores.length; i++) {
? ? ? ? ? ? System.out.print("第" + (i+1) +"組有" + scores[i].length + "個學員,成績如下:");
? ? ? ? ? ? for (int j = 0; j < scores[i].length; j++) {
? ? ? ? ? ? ? ? System.out.print(scores[i][j]+"\t");
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();
? ? ? ? }
? ? }
}

四、二維數組的默認值

舉例

①int[][] arr1 = new int[][];

②int[][] arr2 = new int[2][];

③int[][] arr3 = new int[3][3];

......

說明

①寫法是錯誤的,因為在創建二維數組的時候缺少維數,不知道創建多大空間。

②創建一個有兩個元素的二維數組,由于兩個元素并未定義,而二維數組是引用數據類型,所以兩個元素的默認值均為null。

③創建一個有三個元素的二維數組,由于三個元素均定義為int類型的一維數組,所以二維數組的三個元素保存的是三個一維數組的地址值。而三個一維數組是int類型一維數組,所以默認值是0。

......

總結

①byte、short、int的默認值是0

②long的默認值是0L

③float的默認值是0.0F

④double的默認值是0.0

⑤char的默認值是0或‘\u0000’(表現為空)

⑥boolean的默認值是false

⑦引用類型的默認值是null

五、內存解析

解析一:

解析二:

?

六、案例

案例一:獲取arr數組中所有元素的和。

public class test {
?? ?public static void main(String[] args) {
?? ??? ?int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
?? ??? ?
?? ??? ?int sum = 0;
?? ??? ?for(int i=0;i<arr.length;i++){
?? ??? ??? ?for(int j=0;j<arr[i].length;j++){
?? ??? ??? ??? ?sum += arr[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?System.out.println("總和為:" + sum);
?? ?}
}

案例二:聲明:int[] x,y[]; 在給x,y變量賦值以后,以下選項允許通過編譯的是:

聲明:int[] x,y[]; 在給x,y變量賦值以后,以下選項允許通過編譯的是:
a) ? ?x[0] = y; ? ? ? ? ? ? ? ? //no
b) ? ?y[0] = x; ? ? ? ? ? ? ? ? //yes
c) ? ?y[0][0] = x; ? ? ? ? ? ? ?//no
d) ? ?x[0][0] = y; ? ? ? ? ? ? ?//no
e) ? ?y[0][0] = x[0]; ? ? ? ? ? //yes
f) ? ?x = y; ? ? ? ? ? ? ? ? ? ?//no

提示:
一維數組:int[] x ?或者int x[] ??
二維數組:int[][] y 或者 ?int[] y[] ?或者 int ?y[][]

案例三:使用二維數組打印一個 10 行楊輝三角。

public class YangHuiTest {
? ? public static void main(String[] args) {

? ? ? ? //1. 動態初始化的方式創建二維數組
? ? ? ? int[][] yangHui = new int[10][];

? ? ? ? for (int i = 0; i < yangHui.length; i++) {
? ? ? ? ? ? yangHui[i] = new int[i + 1];

? ? ? ? ? ? //2. 給數組元素賦值
? ? ? ? ? ? // 2.1 給外層數組元素中的首元素和末元素賦值
? ? ? ? ? ? yangHui[i][0] = yangHui[i][i] = 1;

? ? ? ? ? ? //2.2 給外層數組元素中的非首元素和非末元素賦值(難)
? ? ? ? ? ? //if(i > 1){ //從 i == 2 開始執行
? ? ? ? ? ? ? ? for(int j = 1;j < yangHui[i].length - 1;j++){ //非首元素和非末元素的角標范圍
? ? ? ? ? ? ? ? ? ? yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];

? ? ? ? ? ? ? ? }
? ? ? ? ? ? //}
? ? ? ? }

? ? ? ? //3. 遍歷二維數組
? ? ? ? for (int i = 0; i < yangHui.length; i++) {
? ? ? ? ? ? for (int j = 0; j < yangHui[i].length; j++) {
? ? ? ? ? ? ? ? System.out.print(yangHui[i][j] + "\t");
? ? ? ? ? ? }

? ? ? ? ? ? System.out.println();
? ? ? ? }

? ? }
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42847.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【福利】代碼公開!咸魚之王自動答題腳本

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 微信或QQ打開咸魚之王小程序&#xff0c;進入答題界面&#xff0c;運行main.py。期間不要動鼠標。 可自行更改代碼來適配自己的需求~ 可以按照示例圖片…

Kubernetes(k8s)和Docker Compose本質區別

Kubernetes&#xff08;k8s&#xff09;和Docker Compose是兩種不同的容器編排工具&#xff0c;它們有各自的特點和使用場景。 Kubernetes&#xff1a; Kubernetes是一個開源的容器編排平臺&#xff0c;用于自動化計算機軟件的部署、擴展和管理。它支持跨多個主機集群的容器化…

HarmonyOS Next 原生應用開發-從TS到ArkTS的適配規則(四)

一、不支持以#開頭的私有字段 規則&#xff1a;arkts-no-private-identifiers 級別&#xff1a;錯誤 ArkTS不支持使用#符號開頭聲明的私有字段。改用private關鍵字。 TypeScript class C {#foo: number 42 }ArkTS class C {private foo: number 42 }二、類型、命名空間的命…

深入了解線程鎖的使用及鎖的本質

文章目錄 線程鎖的本質局部鎖的使用 鎖的封裝及演示線程饑餓問題 線程加鎖本質可重入和線程安全死鎖問題 根據前面內容的概述, 上述我們已經知道了在linux下關于線程封裝和線程互斥,鎖的相關的概念, 下面就來介紹一下關于線程鎖的一些其他概念. 線程鎖的本質 當這個鎖是全局的…

Codeforces Round #956 (Div. 2) and ByteRace 2024

A. Array Divisibility 思路: 找出特例,發現輸出 1~&#x1d45b; 符合題意。直接輸出1~n即可. 代碼: #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000005 ll dp[N], w[N], v[N], h[N]; ll dis[1005][1005]; ll a, b, c, n, m, t;…

iOS 開發技巧 - 使用本地 json 文件

前言 使用本地 json 文件的場景&#xff0c;在我們開發功能的階段&#xff0c;服務端接口字段定義好了后&#xff0c;有些接口響應很慢&#xff0c;請求到響應可能要 幾十秒甚至一分鐘&#xff0c;我們需要頻繁調用接口來調試功能&#xff1b;還有就是調用一些我們需要付費的三…

Ubuntu20.04下修改samba用戶密碼

Ubuntu20.04下修改samba用戶密碼 在Ubuntu系統中&#xff0c;修改samba密碼通常涉及到兩個方面&#xff1a;更改samba用戶的密碼和重置samba服務的密碼數據庫。以下是如何進行操作的步驟&#xff1a; 1、更改samba用戶密碼&#xff1a; 打開終端&#xff0c;使用以下命令更改…

vue打包terser壓縮去除控制臺打印和斷點

情況一&#xff1a; 1、vue-cli搭建 代碼壓縮工具terser在vue-cli里面是自動支持的&#xff0c;所以直接在vue.config.js里面加入下面配置&#xff1a; const {defineConfig} require(vue/cli-service) module.exportsdefineConfig({transpileDependencies:true,terser:{te…

看影視學英語(假如第一季第一集)

in the hour也代表一小時嗎&#xff1f;等同于in an hour&#xff1f;

activemq-CVE-2022-41678

Apache ActiveMQ Jolokia 后臺遠程代碼執行漏洞 Apache ActiveMQ在5.16.5&#xff0c;5.17.3版本及以前&#xff0c;后臺Jolokia存在一處任意文件寫入導致的遠程代碼執行漏洞。 啟動環境 admin/admin 方法一&#xff1a;利用poc 這個方法受到ActiveMQ版本的限制&#xff0c;因…

Linux 創建新虛擬機的全過程圖解

一、創建新虛擬機 1.選擇自定義 2.直接下一步 3.選擇稍后安裝 4.設置虛擬機名和安裝位置 5.配置處理器&#xff08;處理器數量&#xff1a;4、每個處理器的內核&#xff1a;2&#xff09; 6. 內存選擇 7.網絡類型 8. IO控制器類型-默認推薦 9.磁盤類型-默認推薦 10.選擇虛擬磁…

JS代碼動態打印404頁面源碼

JS代碼動態打印404頁面源碼&#xff0c;適合做網站錯誤頁&#xff0c;具有js動態打印效果&#xff0c;喜歡的朋友可以拿去 源碼由HTMLCSSJS組成&#xff0c;記事本打開源碼文件可以進行內容文字之類的修改&#xff0c;雙擊html文件可以本地運行效果&#xff0c;也可以上傳到服務…

Redis 7.x 系列【22】主從復制配置項

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 前言2. 配置說明2.1 replicaof2.2 masterauth2.3 masteruser2.4 replica-serve-sta…

Linux udp編程

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

Go中gin框架的*gin.Context參數常見實用方法

梗概&#xff1a; *gin.Context是處理HTTP請求的核心。ctx代表"context"&#xff08;上下文&#xff09;&#xff0c;它包含了處理請求所需的所有信息和方法&#xff0c;例如請求數據、響應構建器、路由參數等。 基本的格式&#xff1a; func SomeHandler(ctx *gi…

空間計量模型及 Stata 具體操作步驟

目錄 一、引言 二、空間計量模型理論原理 空間自回歸模型&#xff08;SAR&#xff09;&#xff1a; 空間誤差模型&#xff08;SEM&#xff09;&#xff1a;&#xff0c; 空間杜賓模型&#xff08;SDM&#xff09;&#xff1a; 三、實證模型構建 四、數據準備 五、Stata …

14-56 劍和詩人30 - IaC、PaC 和 OaC 在云成功中的作用

介紹 隨著各大企業在 2024 年加速采用云計算&#xff0c;基礎設施即代碼 (IaC)、策略即代碼 (PaC) 和優化即代碼 (OaC) 已成為成功實現云遷移、IT 現代化和業務轉型的關鍵功能。 讓我在云計劃的背景下全面了解這些代碼功能的當前狀態。我們將研究現代云基礎設施趨勢、IaC、Pa…

【電路筆記】-C類放大器

C類放大器 文章目錄 C類放大器1、概述2、C類放大介紹3、C類放大器的功能4、C 類放大器的效率5、C類放大器的應用:倍頻器6、總結1、概述 盡管存在差異,但我們在之前有關 A 類、B 類和 AB 類放大器的文章中已經看到,這三類放大器是線性或部分線性的,因為它們在放大過程中再現…

Collection 和 Collections 的區別與用法

Collection 和 Collections 的區別與用法 1、Collection 接口1.1 主要特點1.2 常見方法 2、 Collections 工具類2.1 主要特點2.2 常見方法 3、示例代碼3.1 使用 Collection 接口3.2 使用 Collections 工具類 4、總結 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收…

STM32學習歷程(day6)

EXTI外部中斷使用教程 首先先看下EXTI的框圖 看這個框圖就能知道要先初始化GPIO外設 那么和前面一樣 1、先RCC使能時鐘 2、配置GPIO 選擇端口為輸入模式&#xff0c; 3、配置AFIO&#xff0c;選擇我們用的GPIO連接到后面的EXTI 4、配置EXTI&#xff0c;選擇邊沿觸發方式…