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

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

曹智
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 要求: 我需要从数据中任意增加一个数组。 我可以猜测大小(大约100-200),但不能保证每次都适合该数组 一旦增长到最终大小,我就需要对其进行数值计算,因此我更希望最终使用二维numpy数组。 速度至关重要。例如,对于300个文件之一,update()方法被称为4500万次(大约需要150秒),而finalize()方法被称为500k次(总共需要106s)……总共需要250s或者。

  • 问题内容: 我希望这个问题对于本论坛来说不是太基本了,但是我们会看到的。我想知道如何重构一些代码以获得更好的性能,而这些性能已经运行了很多次。 假设我正在使用地图(可能是HashMap)创建一个单词频率列表,其中每个键是一个带有要计数单词的字符串,并且值是一个整数,每次找到该单词的标记时,该值就会递增。 在Perl中,增加这样的值非常容易: 但是在Java中,它要复杂得多。这是我目前的操作方式:

  • 问题内容: 我有两个用Go编写的类似程序的示例。该代码的主要目的是使用结构中的值对结构进行排序。 指针示例 有值的例子 我想知道2分钟: 哪个示例将提高内存效率?(我想这是一种指针方式) 如何使用地图中具有不同数量结构的测试数据来衡量这些示例的性能?您能帮我建立基准吗? 我认为地图中每个结构的大小平均在1-2kB之间。 问题答案: “高效内存”是一个相当宽泛的术语,在诸如Go之类的垃圾收集语言中,

  • 我们有一个在Solaris 10上运行的java进程,为大约200-300个并发用户提供服务。管理员报告说,随着时间的推移,进程使用的内存显著增加。几天内它就达到2GB,并且从未停止增长。 我们已经转储了堆,并使用Eclipse内存探查器对其进行了分析,但没有看到任何异常。堆的大小非常小。 在添加内存统计日志记录后,我们在应用程序中发现管理员使用的“top”实用程序报告的内存使用量与MemoryM

  • 问题内容: (关于省时的稀疏数组存在一些问题,但我正在寻找内存效率。) 我需要一个相当于或哪些 只需设置一个比以前遇到的密钥大的密钥即可按需增长。(可以假定键为非负数。) 与大多数索引不是(即实际数据不是很稀疏时)的情况下的内存效率差不多。 当索引稀疏时,消耗的空间与非索引的数量成正比。 使用的内存少于(因为这会使键自动装箱并且可能不利用标量键类型)。 可以获取或设置摊销log(N)时间中的元素,

  • 本文向大家介绍对Java对象数组进行分组的最有效方法,包括了对Java对象数组进行分组的最有效方法的使用技巧和注意事项,需要的朋友参考一下 在js中对象数组上按键分组的最有效方法是使用reduce函数。 该方法在数组的每个元素上执行reducer函数(由您提供),从而产生单个输出值。 示例 输出结果 这将给出输出-