Java double [] []问题

时间:2011-02-27 08:04:12

标签: java

我正在对我的代码执行以下操作:

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

程序将在没有运行时异常的情况下运行。当我得到像temp.length这样的临时长度时,它返回0,当我尝试访问内部数组的长度时,如temp[0].length,它总是抛出ArrayIndexOutOfBoundsException。 (那只是一个考验。)

现在我想知道,Java确实创建了一个长度为0的数组,同时在一个长度为0的数组中创建了一个长度为2的内部数组?

  1. 这种声明对内存管理有影响吗?
  2. 它会在编码和运行代码时出现并发症吗?
  3. Java真的允许这种声明吗?
  4. 他们在什么意义上允许这种声明,或者只是忽略了这种情况?
  5. 如果他们允许这种声明,它还有一些特殊用途吗?
  6. 我正在探索做这种声明的可能性,并且一直质疑自己是否真的允许这样做。

    很高兴收到您的意见。

3 个答案:

答案 0 :(得分: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]

当然循环没有被执行,所以“内部阵列”没有浪费

答案 1 :(得分: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

答案 2 :(得分: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真的允许这种情况吗?   声明?

是。正如我在第一个声明中所说的那样。

  

他们在什么意义上允许这样做   那种宣言还是只是   忽略了这种情况?

如前所述:有效方案是您要发送和清空二维数组的位置 可能还有其他情况。

  

如果他们允许这个声明   它是否也有一些特殊用途?   除了我的上一个答案,我不确定任何其他情况。但是很想知道它们是否存在。