用Java中的new运算符初始化ArrayList?

时间:2010-08-27 09:21:09

标签: java arraylist

在Java中初始化ArrayList的最佳做法是什么?

如果我使用new运算符初始化ArrayList,则默认情况下ArrayList将为10个存储桶分配内存。这是一个性能损失。

我不知道,也许我错了,但在我看来,如果我确定尺寸,我应该通过提及尺寸来创建ArrayList

8 个答案:

答案 0 :(得分:5)

  

这是一个性能损失。

我不担心“性能受损”。 Java中的对象创建非常快。你不可能衡量绩效差异。

如果您知道,请务必使用尺码。如果你不这样做,无论如何都没有什么可做的。

你在这里做的那种想法被称为“过早优化”。唐纳德克努特说这是万恶之源。

更好的方法是在快速完成代码之前使代码正常工作。利用手中的数据进行优化,告诉您代码的缓慢位置。别猜 - 你可能错了。你会发现很少知道瓶颈在哪里。

答案 1 :(得分:3)

如果您知道要添加多少元素,请使用正确数量的对象初始化ArrayList。如果你不这样做,不要担心。性能差异可能微不足道。

答案 2 :(得分:3)

这是我能给你的最佳建议:

  • 别担心。是的,您有几种方法可以创建ArrayList,但使用new,库提供的默认选项,不是 BAD 选择,否则将它作为每个人的默认选择是愚蠢的,没有说清楚什么更好。
  • 如果事实证明这是一个问题,您可以在分析时快速发现它。当您分析应用程序的性能/内存问题时,这是找到问题的适当位置。当你第一次编写代码时,你不必担心这些东西 - 这是过早的优化 - 你只是担心编写好的,干净的代码,设计好。
  • 如果您的设计很好,您应该能够立即解决此问题,对系统的其他部分影响不大。 Effective Java 2nd Edition,Item 52:通过接口引用对象。如果结果是更好的数据结构,您甚至可以切换到LinkedList或任何其他类型的List。设计这种灵活性。
  • 最后, Effective Java 2nd Edition,第1项:考虑静态工厂方法而不是构造函数。你甚至可以将它与项目5结合起来:避免创建不必要的对象,如果事实上实际上不需要新实例(例如Integer.valueOf没有总是创建一个新实例。)

相关问题


开启ArrayList微观管理

如果您需要对ArrayList

进行微观管理,以下是一些具体的提示
  • 您可以使用ArrayList(int initialCapacity)设置列表的初始容量。如果需要,该列表将自动超出此容量。
  • 当您即将填充/添加到ArrayList,并且您知道元素的总数是多少时,您可以使用ensureCapacity(int minCapacity)(或直接使用上面的构造函数)来减少中间增长的数量。每个add都将以摊还的常量时间运行,无论您是否这样做(如API中所保证的那样),因此这只能通过常数因子降低成本。
  • 您可以trimToSize()最小化存储空间使用情况。

这种微观管理通常是不必要的,但如果您决定(通过确定的分析结果证明)值得麻烦,您可以选择这样做。

另见

答案 3 :(得分:1)

如果您已经知道ArrayList的大小(大约),那么应该使用具有容量的构造函数。但是大多数时候开发人员并不真正知道列表中的内容,因此对于大多数情况来说,容量为10就足够了。

除非你已经知道你的ArrayList包含大量元素,否则10个桶是一个近似值并不是性能损失,在这种情况下,需要一直调整的数组表现很受欢迎。

答案 4 :(得分:1)

您无需告知ArrayList的初始大小。您可以随时轻松添加/删除任何元素。

如果这是性能问题,请记住以下事项:

  1. ArrayList的初始化速度非常快。别担心。
  2. 从ArrayList添加/删除元素也非常快。别担心。
  3. 如果您发现代码运行速度太慢。第一个责备是你的算法,没有冒犯。机器规格,操作系统和语言确实也参与其中。但与您的算法参与相比,他们的参与被认为是微不足道的。

答案 5 :(得分:1)

如果您不知道ArrayList的大小,那么您最好使用LinkedList,因为LinkedList.add()操作的速度是恒定的。

然而,因为这里的大多数人都说在进行某种分析之前不应该担心速度。

您可以使用这篇旧的,但很好(在我看来)的文章作为参考。 http://chaoticjava.com/posts/linkedlist-vs-arraylist/

答案 6 :(得分:0)

由于ArrayList是由数组底层实现的,我们必须为数组选择一个初始大小。

答案 7 :(得分:0)

如果你真的在乎,你可以在构建并填充对象后调用trimToSize()。 javadoc声明容量至少与列表大小一样大。如前所述,你不太可能会发现分配给ArrayList的内存是性能瓶颈,如果是,我建议你改用阵列。