Java:2D int数组的固定大小数组[重复]
Posted
技术标签:
【中文标题】Java:2D int数组的固定大小数组[重复]【英文标题】:Java: fixed size array of 2D int array [duplicate] 【发布时间】:2012-08-12 01:58:44 【问题描述】:是否可以创建一个二维 int 数组的数组,例如:
int n = 100;
int[][] [] a = new int[][] [n];
数组具有固定长度n
,矩阵(二维数组)具有不同的非零大小(至少1 x 1
)。
为了性能,我想将它存储在堆栈中,而不是:
ArrayList<int[][]> a = new ArrayList<int[][]>(n);
据我所知,它将存储在堆上。
【问题讨论】:
数组总是存储在堆中——至少在概念上是这样。它们是引用类型。 (非常聪明的 JVM 可能会执行逃逸分析,但您应该假设它将在堆上。) 如果您的数组进入集合,它们将不会存储在堆栈中。 Java可能尝试对此进行优化(link;请参阅答案底部的 Jon 的注释),但不是必须的。 建议,二维数组被高估了:使用长度*宽度的伪二维数组,使用[x+(length*y)]
访问
即使是像int[] a = new int[5]
这样的简单数组也会在堆上。好的,感谢您的信息,所以ArrayList
是一个解决方案。
@TheZ:很有趣,很高兴看到[x*y]线性阵列优于二维阵列的原因..
【参考方案1】:
是否可以创建一个二维 int 数组的数组,例如:
int n = 100; int[][] [] a = new int[][] [n];
--> 这对语法无效,你会得到编译器错误。使用:
int n = 100;
int[][] [] a = new int[n][] [];
但是a
是一个对象,因为java 中的数组是对象,所以a
将存储在堆上而不是堆栈上。
【讨论】:
【参考方案2】:创建 3D 数组
int n = 100;
int[][][] a = new int[n][][];
这将创建 100 个任意维度的数组。
这几乎和(低)效率一样
List<int[][]> a = new ArrayList<int[][]>(n);
【讨论】:
@downvoter 你能评论一下为什么吗? +1 作为反对票的安慰(5:1 回报——赢!)。 只是为了幽默:没有什么可以“几乎和 X 一样(低)效率”,因为它必须同时从双方接近 X 的效率 :) @MarkoTopolnik 是的,无论哪种方式,差异都无关紧要。 ;)以上是关于Java:2D int数组的固定大小数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章