2011-02-27 60 views
0

我做我的代碼如下:的Java double [] []問題

double[][] temp=new double[0][2]; 

程序將不運行時異常運行。當我得到像這樣的溫度長度temp.length它返回0,當我試圖訪問這樣的temp[0].length內部數組的長度時,它總是拋出一個ArrayIndexOutOfBoundsException。 (這只是一個測試。)

現在我想知道,Java確實創建了一個長度爲0的數組,並且同時在長度爲0的數組中創建了一個長度爲2的內部數組?

  1. 這種聲明是否對內存管理有影響?
  2. 它會在編碼和運行代碼方面發展複雜嗎?
  3. Java真的允許這種聲明嗎?
  4. 他們在什麼意義上允許這種聲明或者他們是否忽略了這種情況?
  5. 如果他們允許這個聲明它也有一些特殊用途?

我只是在探討做這種聲明的可能性,並且一直在質疑自己是否真的可以接受。

您的意見非常感謝。

回答

1

唯一有效的方案,我能想到的是你想發送和清空二維數組。

double[][] temp = new double[0][0]; 
return temp; 

以上是在許多矩陣計算中的有效要求。

這種聲明是否對內存管理有影響 ?

不確定。也可能依賴於JVM到JVM的實現。

它會在 編碼和運行代碼上發展複雜嗎?

它不應該,如果你正在訪問的陣列在一個循環中這樣

for(int i = 0; i<temp.length;i++) 
    for(int j=0; j<temp[i].length;j++) 
    { 
     // your code 
    } 

否則,如果你正在使用的索引,那麼你應該先檢查索引範圍直接訪問。

Java是否真的允許這種 聲明?

是的。正如我在第一份聲明中所說的那樣。

在何種意義上,他們才允許這種 種類的聲明還是他們只是 忽視這種情況?

正如之前所說:有效的情形是,你要發送的空二維數組 可能有其他方案。

如果他們允許這個聲明 它也有一些特殊用途嗎? 除了我最後的回答,我不確定任何其他情況。但很想知道它們是否存在。

5

它相當於

double[][] temp = new double[0][]; // a zero length array of double[] 

for(int d=0; d<0; d++) 
    temp[d] = new double[2];  // whose each element is a new double[2] 
當然

不執行循環,所以沒有浪費來自「內部陣列」

2

看到數組創建的15.10.1運行時評價表達式(JLS 3 - CHAPTER 15 Expressions

如果數組創建表達式 包含N個DimExpr表達式,然後 它有效地執行深度N-1的一組 嵌套循環以創建隱含的數組陣列。對於 例如,聲明:

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

等同於行爲:

float[][] matrix = new float[3][]; 
for (int d = 0; d < matrix.length; d++) 
     matrix[d] = new float[3]; 

,所以

double[][] temp=new double[0][2]; 

將相當於

double[][] matrix = new double[0][]; 
for (int d = 0; d < 0; d++) 
     matrix[d] = new double[2];//would newer hepened