【问题标题】:Java: fixed size array of 2D int array [duplicate]Java:2D int数组的固定大小数组[重复]
【发布时间】: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]线性阵列优于二维阵列的原因..

标签: java performance multidimensional-array


【解决方案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 是的,无论哪种方式,差异都无关紧要。 ;)
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多