在Java中初始化ArrayList
的最佳做法是什么?
如果我使用new
运算符初始化ArrayList,则默认情况下ArrayList将为10个存储桶分配内存。这是一个性能损失。
我不知道,也许我错了,但在我看来,如果我确定尺寸,我应该通过提及尺寸来创建ArrayList
!
答案 0 :(得分:5)
这是一个性能损失。
我不担心“性能受损”。 Java中的对象创建非常快。你不可能衡量绩效差异。
如果您知道,请务必使用尺码。如果你不这样做,无论如何都没有什么可做的。
你在这里做的那种想法被称为“过早优化”。唐纳德克努特说这是万恶之源。
更好的方法是在快速完成代码之前使代码正常工作。利用手中的数据进行优化,告诉您代码的缓慢位置。别猜 - 你可能错了。你会发现很少知道瓶颈在哪里。
答案 1 :(得分:3)
如果您知道要添加多少元素,请使用正确数量的对象初始化ArrayList。如果你不这样做,不要担心。性能差异可能微不足道。
答案 2 :(得分:3)
这是我能给你的最佳建议:
ArrayList
,但使用new
,库提供的默认选项,不是 BAD 选择,否则将它作为每个人的默认选择是愚蠢的,没有说清楚什么更好。LinkedList
或任何其他类型的List
。设计这种灵活性。Integer.valueOf
没有总是创建一个新实例。)static
工厂方法(也在Guava中)ArrayList
微观管理如果您需要对ArrayList
:
ArrayList(int initialCapacity)
设置列表的初始容量。如果需要,该列表将自动超出此容量。ArrayList
,并且您知道元素的总数是多少时,您可以使用ensureCapacity(int minCapacity)
(或直接使用上面的构造函数)来减少中间增长的数量。每个add
都将以摊还的常量时间运行,无论您是否这样做(如API中所保证的那样),因此这只能通过常数因子降低成本。trimToSize()
最小化存储空间使用情况。这种微观管理通常是不必要的,但如果您决定(通过确定的分析结果证明)值得麻烦,您可以选择这样做。
Collections.singletonList
- 返回仅包含指定对象的不可变列表。答案 3 :(得分:1)
如果您已经知道ArrayList的大小(大约),那么应该使用具有容量的构造函数。但是大多数时候开发人员并不真正知道列表中的内容,因此对于大多数情况来说,容量为10就足够了。
除非你已经知道你的ArrayList包含大量元素,否则10个桶是一个近似值并不是性能损失,在这种情况下,需要一直调整的数组表现很受欢迎。答案 4 :(得分:1)
您无需告知ArrayList的初始大小。您可以随时轻松添加/删除任何元素。
如果这是性能问题,请记住以下事项:
答案 5 :(得分:1)
如果您不知道ArrayList
的大小,那么您最好使用LinkedList
,因为LinkedList.add()
操作的速度是恒定的。
然而,因为这里的大多数人都说在进行某种分析之前不应该担心速度。
您可以使用这篇旧的,但很好(在我看来)的文章作为参考。 http://chaoticjava.com/posts/linkedlist-vs-arraylist/
答案 6 :(得分:0)
由于ArrayList是由数组底层实现的,我们必须为数组选择一个初始大小。
答案 7 :(得分:0)
如果你真的在乎,你可以在构建并填充对象后调用trimToSize()。 javadoc声明容量至少与列表大小一样大。如前所述,你不太可能会发现分配给ArrayList的内存是性能瓶颈,如果是,我建议你改用阵列。