Java 由N个元素组成的一维数组是否需要与2D[m][N]相同的内存量,m*N=N

Java 由N个元素组成的一维数组是否需要与2D[m][N]相同的内存量,m*N=N,java,arrays,Java,Arrays,下面是关于Java中内存分配的问题 假设我有一个整数A[100]数组和另一个整数B[10][10]数组。它们在Java中需要相同的内存量还是不同?如果是后者,有什么区别?它是如何随N增长的 我在这里只讨论n是正数的2的幂,所以我们在这里讨论的是二维正方形阵列及其可能的一维表示。确切地说,不是 在C/C++中,2D数组在“一个块”中为2D数组分配所有内存 在Java中,2D数组是“数组的数组”。一维数组分配在一个块中,但一维数组可能分散。此外,“外部”数组(第二维)也需要堆内存,以存储对1D数组的

下面是关于Java中内存分配的问题

假设我有一个整数A[100]数组和另一个整数B[10][10]数组。它们在Java中需要相同的内存量还是不同?如果是后者,有什么区别?它是如何随N增长的

我在这里只讨论n是正数的2的幂,所以我们在这里讨论的是二维正方形阵列及其可能的一维表示。

确切地说,不是

在C/C++中,2D数组在“一个块”中为2D数组分配所有内存

在Java中,2D数组是“数组的数组”。一维数组分配在一个块中,但一维数组可能分散。此外,“外部”数组(第二维)也需要堆内存,以存储对1D数组的引用

因此,如果分配一个维度的2D数组
m
(外部)和
n
(内部),Java将分别创建一个
m
元素数组和
m
元素数组。外部数组只存储对
m
内部数组的引用


对Java中的多维数组进行了很好的解释和可视化。

当使用“new”创建对象时,会在堆上分配内存并返回引用。数组也是如此,因为数组是对象

  • 一维数组
  • int arr[]=新int; int[]arr只是对3整数数组的引用。如果创建一个包含10个整数的数组,则相同–分配一个数组并返回一个引用

  • 二维阵列
  • 实际上,在Java中我们只能有一维数组。二维数组基本上只是一维数组中的一维数组

    int[ ][ ] arr = new int[3][ ];
    arr[0] = new int[3];
    arr[1] = new int[5];
    arr[2] = new int[4];
    

    多维数组使用名称规则

    正如您所观察到的,在管理2D阵列时,需要额外的1D阵列,因此在内存方面,大小不同,但从用户视图来看,两者的大小相同


    这是对@Turing85答案的实证确认,以及对开销的测量。这个程序交替地分配和释放一个包含一百万个元素的数组或一个int[1000][1000],报告每一步使用的内存量。它很快就归结为:

    Neither: 291696
    1D: 4291696
    Neither: 291696
    2D: 4311696
    
    显示2D机箱使用的额外20000字节内存

    节目如下:

    public class Test {
      public static void main(String[] args) {
        int M=1000;
        for(int i=0; i<10; i++){
          System.out.println("Neither: "+inUseMem());
          int[] oneArray = new int[M*M];
          System.out.println("1D: "+inUseMem());
          oneArray = null;
          System.out.println("Neither: "+inUseMem());
          int[][] twoArray = new int[M][M];
          System.out.println("2D: "+inUseMem());
          twoArray = null;
        }
      }
    
      private static long inUseMem() {
        System.gc();
        return Runtime.getRuntime().totalMemory()
            - Runtime.getRuntime().freeMemory();
      }
    }
    
    公共类测试{
    公共静态void main(字符串[]args){
    int M=1000;
    
    对于(int i=0;iSerly?你使用我回答中提到的链接,不引用源代码,只是重新表述?这有点懒惰,侵犯了你使用的图像的版权,而且通常是不好的做法。@Turing85我觉得解决方案就在有疑问的人面前。是的,你的链接正确地描述了主题但我的规则是让解决方案就在那里,为什么要加载另一个页面毕竟我们是开发人员,优化人员不是。但我会记住版权的事情,谢谢,我们是开发人员,我们是优化人员。这就是我们避免(代码)重复和使用(其他方面)引用的原因;)@Turing85抱歉,下次我会尝试在我的答案中提供更多链接。我们首先是好人,然后是开发者。是的,我认为我应该赞扬链接背后的人。这里是dude。我提到了链接。如果你真的关心性能,请使用1-D数组。@bayou.io但请记住这一点(在大多数情况下)以牺牲可读性为代价。@Turing85-还不错-
    A[N*x+y]与B[x][y]