最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多重數(shù)組使用及說明

 更新時間:2026年01月31日 09:09:26   作者:心之語歌  
本文介紹了Java中多維數(shù)組的定義、聲明、初始化、訪問、遍歷以及內(nèi)存結(jié)構(gòu),文章還討論了Java多維數(shù)組與C/C++的區(qū)別,以及如何處理鋸齒數(shù)組和深拷貝,此外,還提到了數(shù)組與鏈表的區(qū)別,包括它們的內(nèi)存布局、操作效率和適用場景

概念

在 Java 中,“多重數(shù)組”通常指的是多維數(shù)組(Multidimensional Arrays),最常見的是二維數(shù)組(如矩陣),但也可以有三維、四維等。

多重數(shù)組概念

Java 的多重數(shù)組本質(zhì)上是 “數(shù)組的數(shù)組”(array of arrays),即:

  • 一維數(shù)組:int[] arr
  • 二維數(shù)組:int[][] matrix → 每個元素是一個 int[]
  • 三維數(shù)組:int[][][] cube → 每個元素是一個 int[][]

Java 的多維數(shù)組不要求每行長度相同(稱為“鋸齒數(shù)組”或“不規(guī)則數(shù)組”)。

聲明與初始化

1. 聲明

int[][] matrix;          // 聲明一個二維整型數(shù)組
String[][][] data;       // 三維字符串數(shù)組

2. 初始化方式

方式一:直接字面量初始化(推薦用于小數(shù)據(jù))

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

方式二:指定大小(規(guī)則矩形)

int rows = 3, cols = 4;
int[][] mat = new int[rows][cols];  // 3x4 的全 0 矩陣

方式三:鋸齒數(shù)組(Jagged Array)— 每行長度不同

int[][] jagged = new int[3][];      // 3 行,列數(shù)未定
jagged[0] = new int[2];             // 第0行有2列
jagged[1] = new int[5];             // 第1行有5列
jagged[2] = new int[1];             // 第2行有1列

注意:new int[3][4] 是規(guī)則數(shù)組;new int[3][] 是鋸齒數(shù)組(需手動初始化每行)。

訪問與修改元素

int value = matrix[i][j];     // 讀取第 i 行第 j 列
matrix[i][j] = 100;           // 修改

邊界檢查:Java 會在運行時自動檢查下標是否越界(拋出 ArrayIndexOutOfBoundsException)。

遍歷多重數(shù)組

1. 普通 for 循環(huán)(知道行列數(shù))

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}
  • matrix.length → 行數(shù)
  • matrix[i].length → 第 i 行的列數(shù)(支持鋸齒數(shù)組?。?/li>

2. 增強 for 循環(huán)(for-each,簡潔安全)

for (int[] row : matrix) {
    for (int val : row) {
        System.out.print(val + " ");
    }
    System.out.println();
}

推薦:優(yōu)先使用 for-each,避免下標錯誤,尤其處理鋸齒數(shù)組時更安全。

內(nèi)存結(jié)構(gòu)(重要理解)

Java 的二維數(shù)組不是一塊連續(xù)內(nèi)存(不像 C/C++),而是:

  • 一個一維數(shù)組,每個元素指向另一個一維數(shù)組
  • 所以可以每行長度不同(鋸齒)
matrix → [ ref0, ref1, ref2 ]
           ↓     ↓     ↓
         [1,2] [3,4,5] [6]

優(yōu)勢:靈活;劣勢:緩存局部性較差(相比連續(xù)內(nèi)存)

常見使用場景(面試高頻)

場景示例
矩陣操作旋轉(zhuǎn)矩陣、螺旋遍歷、對角線遍歷
動態(tài)規(guī)劃二維 DP 表(如 LCS、編輯距離)
圖的鄰接矩陣graph[i][j] == 1 表示 i→j 有邊
棋盤/地圖模擬迷宮、島嶼數(shù)量、生命游戲
分組存儲每行代表一類數(shù)據(jù)

實用工具方法

1. 獲取行列數(shù)

int rows = matrix.length;
int cols = matrix[0].length;  // 注意:僅當至少有一行且非空時安全!

安全寫法(處理空數(shù)組):

if (matrix == null || matrix.length == 0) return;
int rows = matrix.length;
int cols = matrix[0].length; // 此時可安全訪問

2. 深拷貝二維數(shù)組(避免引用共享)

int[][] deep = new int[original.length][];
for (int i = 0; i < original.length; i++) {
    deep[i] = original[i].clone(); // 克隆每一行
}
類型含義特點
淺拷貝(Shallow Copy)復(fù)制對象的引用,不復(fù)制內(nèi)部對象新舊數(shù)組共享子對象
深拷貝(Deep Copy)遞歸復(fù)制所有層級的對象完全獨立,互不影響
數(shù)組類型淺拷貝是否安全?如何實現(xiàn)深拷貝
int[], double[] 等基本類型? 安全(值拷貝)arr.clone() 即可
String[]?? 表面安全(String 不可變)通常 clone() 足夠
int[][](二維基本類型)? 不安全循環(huán) + row.clone()
Object[](含可變對象)? 不安全需手動深拷貝每個元素(可能遞歸)

注意:String 雖是引用類型,但不可變(immutable),所以淺拷貝通常不會出問題。但如果是 StringBuilder[],就必須深拷貝!

誤區(qū)正確理解
“clone() 就是深拷貝”? 默認是淺拷貝,除非重寫 clone() 方法
“Arrays.copyOf() 是深拷貝”? 對多維數(shù)組仍是淺拷貝
“基本類型數(shù)組不需要深拷貝”? 正確!因為存的是值,不是引用

常見陷阱 & 注意事項

問題說明
空指針異常matrix 為 null,或某行為 null(鋸齒數(shù)組未初始化)
列數(shù)不一致誤以為所有行長度相同,直接用 matrix[0].length 遍歷所有行
淺拷貝問題直接賦值導(dǎo)致修改副本影響原數(shù)組
內(nèi)存浪費用二維數(shù)組存稀疏矩陣(此時應(yīng)考慮 Map<Pair, Value> 或稀疏表示)

數(shù)組跟鏈表

數(shù)組(Array)和鏈表(Linked List)是兩種最基礎(chǔ)、最重要的線性數(shù)據(jù)結(jié)構(gòu)。它們在內(nèi)存布局、操作效率、適用場景上有本質(zhì)區(qū)別。掌握它們的差異,是算法設(shè)計和系統(tǒng)優(yōu)化的關(guān)鍵。

特性數(shù)組(Array)鏈表(Linked List)
內(nèi)存布局連續(xù)內(nèi)存塊非連續(xù),靠指針連接
隨機訪問? O(1)(通過下標)? O(n)(必須遍歷)
插入/刪除(中間)? O(n)(需移動元素)? O(1)(已知節(jié)點時)
插入/刪除(頭部)? O(n)(除非用特殊技巧)? O(1)
插入/刪除(尾部)? O(1)(動態(tài)數(shù)組均攤)? O(1)(若有 tail 指針)
空間開銷僅數(shù)據(jù)本身每個節(jié)點額外存指針(如 next)
緩存友好性? 高(局部性好)? 低(內(nèi)存跳躍)
大小固定?靜態(tài)數(shù)組固定;動態(tài)數(shù)組可擴容動態(tài)伸縮,無需預(yù)分配
場景推薦結(jié)構(gòu)原因
需要頻繁隨機訪問(如排序、DP)? 數(shù)組O(1) 訪問
頻繁在頭部/中間插入刪除? 鏈表O(1) 修改指針
元素數(shù)量固定或可預(yù)估? 數(shù)組內(nèi)存緊湊,性能高
實現(xiàn)棧(只操作尾部)? 數(shù)組 or 鏈表兩者都 O(1)
實現(xiàn)隊列(首尾操作)? 鏈表 or 循環(huán)數(shù)組鏈表天然支持;數(shù)組需循環(huán)緩沖
內(nèi)存敏感(小對象大量存儲)? 數(shù)組鏈表指針開銷大
需要緩存友好(高性能計算)? 數(shù)組連續(xù)內(nèi)存,預(yù)取高效

擴展:高維數(shù)組(了解即可)

// 三維數(shù)組:3 層,每層 4 行,每行 5 列
int[][][] cube = new int[3][4][5];

// 訪問
cube[0][1][2] = 10;

// 遍歷
for (int[][] layer : cube) {
    for (int[] row : layer) {
        for (int val : row) {
            // ...
        }
    }
}

實際開發(fā)中,三維以上數(shù)組較少見,通常用對象封裝更清晰。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

临邑县| 莱州市| 布拖县| 泽州县| 京山县| 达州市| 福州市| 揭阳市| 洪雅县| 白银市| 黄梅县| 探索| 云阳县| 海口市| 濮阳市| 南通市| 泸州市| 大余县| 兴国县| 察隅县| 梁山县| 如皋市| 南部县| 图们市| 卢湾区| 马公市| 将乐县| 海宁市| 慈利县| 忻州市| 吉木萨尔县| 诸城市| 兖州市| 靖安县| 霍州市| 广安市| 安仁县| 中阳县| 莱西市| 日照市| 封开县|