1

我最近发现了 ArrayList 的“toArray() : Object[]”方法,我想知道是否应该利用它来提高性能。

我知道 ArrayList 比 Object[] 数组更昂贵,但它当然更方便,因为它会自动调整大小。但我想如果我使用 ArrayList 来构建我的对象列表,我可以在执行更密集的数据操作时将其转换为 Object[] 数组。

在 ArrayList 完成构建后将 ArrayList 转换为任何数组 Object[] 是一种好习惯吗?有时,如果我遍历 200K 对象 ArrayList 并将其与另一个 ArrayList 对象进行比较,则需要一段时间。我会在性能方面受益吗?

4

3 回答 3

3

首先,您永远不应该对性能做出假设。你需要测量它。我刚刚证明了我的“感觉”是错误的。我很确定ArrayListvs的性能Object[]非常具有可比性。使用initialCapacityset,ArrayList只是对数组的简单包装。这些包装方法肯定是由 JVM 内联的。

原来我错了。我写了一个简单的测试来得到一些实数。在我的机器(Oracle Java 7 64bit,Linux)上,数字是:

ArrayList write: 105.8ms
String[]  write:  39.8ms

ArrayList read:   64.1ms
String[]  read:   40.9ms

所以在 .ArrayList上慢 100%set()和 50% get()

那是没有自动装箱。我还在vs上运行了一个测试ArrayList<Integer>int[]

ArrayList<Integer> write: 2660.0ms
int[]              write:   27.5ms

ArrayList<Integer> read:    59.5ms
int[]              read:    20.2ms

GC 在测试期间没有运行String[],但在int[]测试期间它运行了大约 25 次。

然而,复制ArrayListObject[]只是为了排序没有意义:

14.98ms  Collections.sort(list)
15.32ms  Arrays.sort(list.toArray(new String[list.size()]));
于 2013-11-14T14:50:05.827 回答
1

为了完成以前的回答,当性能很重要时,查看ArrayList的实际实现并分析您将最常使用的特定操作也是一个好习惯。您可以查看 get 和 set 操作的开销(这里的开销是由类型通用性、范围检查和 func 调用引起的)。这将帮助您确定是否会使工作变得更糟。(一般来说,不要到处优化,而只优化真正重要的几个点)

于 2013-11-14T16:30:03.020 回答
0

这真的取决于情况。有时最好转换它,否则它不是。您必须权衡利弊 - 如果您必须对对象执行大量操作,那么 ArrayList 可能是最佳解决方案。当然是因为您项目中的其他人可能依赖于 ArrayList。

否则,如果您知道使用 Array[] 不会损害开发应用程序(这意味着没有其他人依赖它,并且您不介意编写自己的排序等做一些额外的工作)而不是 Array[] 可以成为最佳选择。

Array[] = ArrayList 程序的性能更高 -> 更容易编写/节省时间。

这完全取决于你想做什么:)

于 2013-11-14T13:52:10.190 回答