我正在对我的代码执行以下操作:
double[][] temp=new double[0][2];
程序将在没有运行时异常的情况下运行。当我得到像temp.length
这样的临时长度时,它返回0,当我尝试访问内部数组的长度时,如temp[0].length
,它总是抛出ArrayIndexOutOfBoundsException
。 (那只是一个考验。)
现在我想知道,Java确实创建了一个长度为0的数组,同时在一个长度为0的数组中创建了一个长度为2的内部数组?
我正在探索做这种声明的可能性,并且一直质疑自己是否真的允许这样做。
很高兴收到您的意见。
答案 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真的允许这种情况吗? 声明?
是。正如我在第一个声明中所说的那样。
他们在什么意义上允许这样做 那种宣言还是只是 忽略了这种情况?
如前所述:有效方案是您要发送和清空二维数组的位置 可能还有其他情况。
如果他们允许这个声明 它是否也有一些特殊用途? 除了我的上一个答案,我不确定任何其他情况。但是很想知道它们是否存在。