Java 由N个元素组成的一维数组是否需要与2D[m][N]相同的内存量,m*N=N
下面是关于Java中内存分配的问题 假设我有一个整数A[100]数组和另一个整数B[10][10]数组。它们在Java中需要相同的内存量还是不同?如果是后者,有什么区别?它是如何随N增长的 我在这里只讨论n是正数的2的幂,所以我们在这里讨论的是二维正方形阵列及其可能的一维表示。确切地说,不是 在C/C++中,2D数组在“一个块”中为2D数组分配所有内存 在Java中,2D数组是“数组的数组”。一维数组分配在一个块中,但一维数组可能分散。此外,“外部”数组(第二维)也需要堆内存,以存储对1D数组的引用 因此,如果分配一个维度的2D数组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数组的
m
(外部)和n
(内部),Java将分别创建一个m
元素数组和m
元素数组。外部数组只存储对m
内部数组的引用
对Java中的多维数组进行了很好的解释和可视化。当使用“new”创建对象时,会在堆上分配内存并返回引用。数组也是如此,因为数组是对象
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]