用Java增长数组的最有效内存方式?


问题内容

我不是太在意时间效率(这种操作很少见),而是在内存效率上: 我可以在不将所有值都临时设置两次的情况下增加数组吗?

有没有比创建一个新数组并复制所有值更有效的方法来增长大型数组?喜欢,将其与新的连接起来吗?

将固定大小的数组存储在另一个数组中并重新分配/复制该顶级数组会怎样?会保留实际值吗?

我知道ArrayList,但是我需要对访问数组进行大量控制,并且访问必须非常快。举例来说,我想我更喜欢a[i]al.get(i)

我关心此问题的主要原因是,所讨论的数组(或多个此类数组)可能会占据主内存的足够大的部分,以至于在丢弃原始副本之前创建双倍大小的副本的通常策略可能无法正常工作出来。这可能意味着我需要重新考虑整体策略(或提出我的硬件建议)。


问题答案:

有没有比创建一个新数组并复制所有值更有效的方法来增长大型数组?喜欢,将其与新的连接起来吗?

不会。而且可能没有语言可以保证在不复制的情况下总是能够增长数组。为数组分配空间并执行其他操作后,很可能在数组结尾之后立即在内存中保留其他对象。到那时,从根本上讲,如果不复制数组就无法增长数组。

将固定大小的数组存储在另一个数组中并重新分配/复制该顶级数组会怎样?会保留实际值吗?

您是说拥有一个数组数组,并将其视为由基础数组的串联组成的一个大数组?是的,这是可行的(如Java中的“通过间接进行伪造”方法),Object[][]只是一个指向Object[]实例的指针数组。