gpt4 book ai didi

java - 什么消耗少,要用ArrayList或者System.arraycopy

转载 作者:行者123 更新时间:2023-11-30 06:45:38 25 4
gpt4 key购买 nike

可能很明显,但我想知道什么以及为什么是降低系统资源消耗的最佳实践。

当我想动态扩展一个数组时,我可以使用其中之一

System.arraycopy(arraystuff, 0, tempArray, 0, arraystuff.length);

ArrayList 

最简单的当然是 ArrayList 但有什么理由使用 arraycopy 吗?

最佳答案

几乎总是,您应该使用更高级别的抽象。您通常不需要关心 ArrayList 在内部调整自身大小,甚至不需要关心它是否将数据存储在数组中(大多数情况下,您会有一个 List引用,而不是 ArrayList);它“正常工作”。

但是,ArrayList 的大小调整策略是固定的:它总是按 a multiplicative factor of 1.5 调整大小。为了分摊在许多添加中重新分配数组的成本。这可能会导致浪费大量空间,例如,如果您只需要向包含 1,000,000 个元素的完整列表中再添加 1 个元素。

没错,您可以使用 trimToSize摆脱这种浪费的空间,但仅在事实发生之后:您将分配一个 1.5M 元素的数组 一个 (1M+1) 元素的数组。 150 万个元素的数组只会被临时分配,然后可以进行 GC,但这仍然比直接分配 (1M+1) 个元素的数组更费力。

在这种情况下,您可能希望拥有一些可以更好地控制其调整大小的方式,在这种情况下,使用 System.arraycopy 可能更合适。

但实际上,直到您分析了您的代码并发现 ArrayList 使用了太多空间,才坚持使用它。


另请注意,您可能会找到 Arrays.copyOf为了调整数组的大小,它比 System.arraycopy 更容易使用,因为它需要更少的参数并且是类型安全的。 (它在内部使用 System.arraycopy)。

关于java - 什么消耗少,要用ArrayList或者System.arraycopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48638318/

25 4 0