当前位置: 首页 > 面试题库 >

多维数组声明中的顺序对已用内存有影响吗?

慕阳文
2023-03-14
问题内容

多少字节将被分配给ab

import android.graphics.Bitmap;

Bitmap[][][] a = new Bitmap[1000][2][2];
Bitmap[][][] b = new Bitmap[2][2][1000];

请注意,我只是在询问纯数组占用的内存,内部没有对象。

我为什么要问?因为我在写Android游戏。对我而言,顺序并不重要,但是如果存在内存差异,最好保存一些。


问题答案:

是的,确实有所作为。

在Java中,2D数组是1D数组的数组,并且数组(像所有对象一样)除具有保存元素本身所需的空间外,还具有标头。

因此,请考虑int[10][2]vs和int[2][10],并假设使用32位JVM。

  • int[2][10]由2个元素的一个数组和10个元素的2个数组组成。总计-3个数组对象+ 22个元素。
  • int[10][2]由10个元素的一个数组和2个元素的10个数组组成。总计-11个数组对象+ 30个元素。

如果我们假设标头大小是3个32位字(对于32位JVM通常如此),而引用是1个32位字,则

  • int[2][10] 需要3 * 3 + 22 * 1 = 31个字= 124字节
  • int[10][2] 需要11 * 3 + 30 * 1 = 63个字= 252个字节

应用相同的逻辑,您可以估计具有更大维数的数组的大小。

但是很明显,如果最大的尺寸是最右边的尺寸,则可以使用较少的空间。

我已经完成了int数组的数学运算,但是在32位计算机上,an int和a
reference占用相同数量的字节。在64位计算机上,引用的大小可以与int或相同long,具体取决于JVM选项。标头大小也可能不同....不确定…可能取决于平台。

我没有考虑容纳Bitmap对象本身所需的空间,但是无论如何组织数组都一样。



 类似资料:
  • 我正在为学院实现DFS和边缘分类(基于本文提供的代码:https://courses.csail.mit.edu/6.006/fall11/rec/rec14.pdf)。 斜体字母只是顶点的名称,而顶点内部的数字分别是发现时间和完成时间。边缘分为后、前或交叉;其他都是树边。 正如您所看到的,该图是按照以下顺序访问的:首先是,然后是它的邻居(在DFS之后);当没有更多可访问的邻居时,访问开始于。 为

  • 我有以下代码: 但当我试着去看测试的内容时,我看到了这个 如果我试图看到什么是在任何项目的数组我得到一个错误: 有人能解释一下我做错了什么,正确的方法是什么吗? Visual Studio 2022, Blazor Webassup,.NET6.0 谢谢

  • 问题内容: 请原谅我这是多余的还是超基本的。我要从R进入Python / Numpy,并且很难在脑海里翻转事物。 我有一个维数组,我想使用索引值的另一个n维数组进行排序。我知道我可以将其包装成一个循环,但是似乎应该有一种非常简洁的Numpyonic方式将其击败并提交。这是设置n = 2的问题的示例代码: 所以现在我有一个2 x 5的随机数数组和2 x 5的索引。我已经阅读了约10次帮助,但显然我的

  • 问题内容: 我正在尝试根据内部数组中的特定值对我的PHP哈希表进行排序。数据结构如下所示: 我已经尝试过 ksort , sort , usort, 但是似乎没有任何作用。我正在尝试根据 名称键 向下两级进行排序。 这是我尝试使用usort的尝试: 有没有简单的方法可以做到这一点,或者我需要编写一个自定义排序功能? 问题答案: 思考,更有用和实用的 如何使用

  • 问题内容: 如何与决定在HTML堆叠元素的订单时,有关系吗? 当我保持小于由具有一些元件上的发言权。元素落后于没有元素的元素。 问题答案: 具有“自动”以外的z索引值的定位元素和不透明度值小于1的元素将生成堆叠上下文。请参阅有关喷漆顺序的规则。 在您的第一个示例中,我们具有带有多个后代的根堆栈上下文,包括: 定位的Z-index为正的绿色框 带有z-index的蓝色框 带有z-index 的蓝色框