【问题标题】:what's the difference between these blocks of code?这些代码块有什么区别?
【发布时间】:2011-12-24 02:56:22
【问题描述】:

所以我在正在阅读的一本书中多次复习这段代码:

int[][] someArray = new int[size][];
for(int i=0; i<size; i++)
   someArray[i] = new int[size];

我认为这与以下声明之间没有任何区别:

int[][] someArray = new int[size][size];

我在这里错过了什么吗?我有什么理由应该使用上面的长代码块吗?

谢谢,

【问题讨论】:

    标签: java multidimensional-array


    【解决方案1】:

    您可以使用第一个构造创建 raggedjagged 数组

    【讨论】:

    • +1 用于提及参差不齐的数组。但在上面的示例中,两个数组将是相同维度(大小 * 大小)的数组。但是想象一下,在第一个代码 sn-p 中,您更改了“someArray[i] = new int[i]”。请注意,我放了 'new int[i]' 而不是 'new int[size]' 这就是它允许你做的事情,这是一个参差不齐的数组!
    • 是的,我会理解,如果他们在 for 循环中给出不同的大小,但他们使用相同的“大小”。所以这对我来说根本没有任何意义。'
    • 你是对的。如果您创建 m*n 数组,那么第一种方式是没有意义的。我只是提到了潜在的差异可能会发生什么
    【解决方案2】:

    没有区别here。当我们想要创建不同大小的数组时,第一个很有用。

    【讨论】:

      【解决方案3】:

      正如 parapura 所说,您可以创建所谓的参差不齐的数组。本质上,您可以制作三角形之类的东西(可能类似于楼梯或圣诞树或任何您想要的东西)。所以它可以像(使用随机数)

      1 2 3

      1 2

      4 4 5 6 2 3 5

      4 5 1

      2 2 5 2

      其中子数组的长度大小不同。在您的示例中,尽管它们的大小相同,但两种方式都做同样的事情。

      这样做的一个原因是节省内存空间,而不是用零填充空槽。

      【讨论】:

        【解决方案4】:

        如有疑问,请查看字节码——尤其是对于像这样只有几行代码的内容。
        显然编译器有一个特殊的构造来创建第二种形式。

        第一种形式(没有循环): 公共静态无效主(java.lang.String[]); 代码: 0:iconst_3 1:新数组#2; //类“[我” 4:astore_1 5:返回

        第二种形式:

        0: iconst_3 1:iconst_3 2: 多新数组#2, 2; //类“[[我” 6:astore_1 7:返回

        ===================

        看待它的一种方法是,当您知道无论如何都会有一个“方形”数组时,循环中会浪费大量时间。想象一下,如果你在 Google,你需要一个 size=10000000 的二维数组。第一种形式会慢得多。

        【讨论】:

          猜你喜欢
          • 2012-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 2011-11-22
          相关资源
          最近更新 更多