亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 中二維數組創建的維度似乎倒退了

Java 中二維數組創建的維度似乎倒退了

一只斗牛犬 2021-12-01 15:31:48
據我了解,java中的二維數組是數組的數組。類似于通常的數組符號,我希望這意味著int[][]實際上是(int[])[](一個 int 數組的數組)。因此我希望數組的長度int[][] array = new int[2][3]; // (int[2])[3] 為 3(因為它將是長度為 3 的數組的長度為 2 的數組)。然而,情況似乎正好相反。我試圖為此找到解釋,但無法找到。我發現很多帖子解釋了如何初始化多維數組,并且它們是數組的數組,但我找不到任何關于索引順序為何以這種方式工作的解釋。我唯一的理論是,人們發現先迭代左索引更自然,而 Java 的構建方式使得此操作更有效,因此開發人員非常慎重地做出了這個選擇。我很感謝任何確認這種解釋的消息來源或任何其他原因。編輯:由于對于為什么有人會相信以相反的方式使用索引是一個好主意似乎有些困惑,這里有一些澄清:對于一個類型T,表達式new T[5]通常產生一個大小為 5 的數組。該類型int[]似乎是一個非常好的類型,但是 Java 不允許我說new (int[])[5],而是強制我使用new int[5][]. 我一直在尋找 Java 對我這樣做的原因(并得到了一個)。對于像我這樣思考的人的(非常好的)答案,我想補充的另一件事是:在一個沒有人考慮過二維數組的世界中,您可以int[]像創建任何類型的數組一樣創建類型的數組其他數組,以下可能是完全合法的代碼。    int[][] = new (int[])[5];    int[] firstArray = new int[3];    int[0] = firstArray;    int[0][2] = 1; // last element of first array    int[0][4] = 2; // IndexOutOfBoundsException, trying to access 5th element of firstArray這當然會完全令人困惑,所以我很高興多維數組得到了特殊處理。
查看完整描述

3 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

表達式 likenew int[2][5]將創建一個長度為 2 的外部數組,每個元素引用一個長度為 5 的數組,因此總共創建了 3 個數組。這在 Java 語言規范示例 15.10.2-2 中有詳細記錄。多維數組創建:


聲明:


float[][] matrix = new float[3][3];

在行為上等同于:


float[][] matrix = new float[3][];

for (int d = 0; d < matrix.length; d++)

    matrix[d] = new float[3];

這并不意味著(int[2])[5],即 5 個引用數組的數組 2。


因此,查找值的表達式從左到右求值,例如x[2][5]mean (x[2])[5],即在int[][] x變量 lookup 中x[2],它是 an int[],在該數組查找值中的 index 5。


int[][] x = new int[9][9];

// z = x[2][5]

int[] y = x[2];

int z = y[5];


查看完整回答
反對 回復 2021-12-01
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

這樣做的原因是數組訪問的重要性。您有一組數組 ( int[][])。然后從中檢索一個數組 ( int[])。然后從那個 ( int) 中檢索一個元素。


有兩種方法可以做到這一點。第一個是最重要的:


for (int i = 0; i < matrix.length; i++) {

    int[] row = matrix[i];

    for int j = 0; j < row.length; j++) {

        int element = row[j];

    }

}

必須int[] row = matrix[][i];在第一個示例中使用是荒謬的,因為約定是array[i]代表 的第一個元素array。在這種情況下,的第一個元素array是一行,而不是一個元素。


始終一致地應用相同的索引排序。


這也符合這樣一個事實,即您可以使用Object[]數組擁有一個奇怪維度的類矩陣對象。也許該數組的一個元素將是int[][][]while 下一個將是int[]。必須以某種方式弄清楚是否放置array[][][][i]或array[][i]當您不知道子數組的維數i并且子數組甚至不一定具有一致的維數時,這會有點奇怪。


查看完整回答
反對 回復 2021-12-01
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

您可能會將 Java 中的二維數組視為數組的數組。考慮以下一般二維數字數組:


1 2 3

4 5 6

7 8 9

我們可以將這個數組定義為:


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

或者,我們可以使用一個空的構造函數,然后填充各個值:


int[][] array = new int[3][3];

array[0][0] = 1;

array[0][1] = 2;

// etc.

但是為了更好地理解 Java 中的 2D 數組是如何工作的,請考慮以下方法:


int[][] array = new int[3][];

arr[0] = new int[] {1, 2, 3};

arr[1] = new int[] {4, 5, 6};

arr[2] = new int[] {7, 8, 9};

希望很清楚二維數組實際上是什么;它是一個數組數組,因此我們可以將其可視化為:


[ ] -> [1, 2, 3]

[ ] -> [4, 5, 6]

[ ] -> [7, 8, 9]

也就是說,數組的第一個索引中的每個元素,大小為 3,對應于行,指向另一個 1D 數組,對應于列。請注意,在 Java 中,二維數組可以是jagged,這意味著我們也可以這樣做:


int[][] array = new int[3][];

arr[0] = new int[] {1, 2, 3, 4, 5};

arr[1] = new int[] {1, 2, 3};

arr[2] = new int[] {7, 7, 7};

為了解決@Henry 在下面的評論中提出的問題,上面二維數組最左邊部分的大小為 3,這與我們在繪制時看到的一致。即,我們看到一個具有 3 個桶的一維數組,每個桶都指向另一個具有某種大小的一維數組。


查看完整回答
反對 回復 2021-12-01
  • 3 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號