2011-02-27 59 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