Performance 为什么2D阵列比对象更好地存储x-y坐标以获得更好的性能和更少的内存?

Performance 为什么2D阵列比对象更好地存储x-y坐标以获得更好的性能和更少的内存?,performance,memory,stack,heap,Performance,Memory,Stack,Heap,假设我想用整数(x,y)坐标存储n个点。我可以使用一个2-d(2Xn)数组,或使用一个列表/集合/或一个包含n个对象的数组,其中每个对象都有2个整数字段来存储坐标。 据我所知,2d阵列选项速度更快,占用内存更少,但我不知道为什么?非常感谢您提供详细的解释或详细的链接。这是一个非常广泛的问题,它有很多部分。首先,这与您使用的语言有关。让我们以Java为例 创建对象时,它从主对象类继承。创建对象时,开销来自用户定义的类继承自对象。编译器必须虚拟化内存中的某些方法调用,以便在调用.equals()或.

假设我想用整数(x,y)坐标存储n个点。我可以使用一个2-d(2Xn)数组,或使用一个列表/集合/或一个包含n个对象的数组,其中每个对象都有2个整数字段来存储坐标。
据我所知,2d阵列选项速度更快,占用内存更少,但我不知道为什么?非常感谢您提供详细的解释或详细的链接。

这是一个非常广泛的问题,它有很多部分。首先,这与您使用的语言有关。让我们以Java为例

创建对象时,它从主对象类继承。创建对象时,开销来自用户定义的类继承自
对象
。编译器必须虚拟化内存中的某些方法调用,以便在调用
.equals()
.toString()
时,程序知道调用哪个方法(即,类的
.equals()
对象的
.equals()
)。这是通过查找表完成的,并在运行时通过指针确定

这就是所谓的虚拟化。现在,在java中,数组实际上是一个对象,因此您实际上不会从数组数组中获得太多好处。事实上,使用自己的类可能会做得更好,因为可以限制与它关联的元数据。java中的数组存储关于其长度的信息

然而,许多集合确实有与之相关的开销<例如,code>ArrayList
将调整自身大小,并将关于自身的元数据存储在内存中,而您可能不需要这些元数据
LinkedList
引用了其他节点,这是其实际数据的开销

现在,我所说的只是关于Java的。在其他OO语言中,对象在内部的行为不同,有些可能效率更高/更低


在C++等语言中,当你分配一个数组时,你实际上只得到了一个内存块,这取决于你想用它做什么。从这个意义上讲,这可能更好。C++使用与对象类似的开销,如果使用重写(关键字<代码>虚拟<代码> >),因为它将在内存中创建这些虚拟查找。p> 所有这些都取决于您使用存储空间的效率以及您的访问要求。必须留出内存来保存一个10000 x 10000的数组,以便只存储10个点,这将是一种可怕的内存浪费。另一方面,如果您花费大量时间迭代列表以在存储的10000000个点中找到实际需要的一个点,那么通过在链表中存储点来节省内存也将毫无意义


两者的一些缺点是可以克服的。稀疏数组,根据某些规则对列表进行预排序,使“需要”的点浮到顶部,等等

在大多数语言中,使用多维数组(如AxB),您只需要拥有足够大的内存块来容纳a*B对象,当您查找元素(m,n)时,只需在位置m*a+B处查找元素即可。当您有一个对象列表时,每个列表都有相关的开销,而且查找比简单的地址计算更复杂


如果矩阵的大小不变,则二维阵列是最快的选择。如果它需要增长和收缩,尽管您可能别无选择,只能使用第二种方法。

为什么要使用2D n*n数组仅存储n个点?