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

用Java中的新运算符初始化ArrayList?,java,arraylist,Java,Arraylist,在Java中初始化ArrayList的最佳实践是什么 如果我使用new操作符初始化ArrayList,那么默认情况下,ArrayList将为10个存储桶分配内存。这是一个性能的打击 我不知道,也许我错了,但在我看来,如果我确定大小的话,我应该通过提及大小来创建一个ArrayList 这是一个性能的打击 我不会担心“性能冲击”。Java中的对象创建速度非常快。您不太可能测量性能差异 如果你知道的话,一定要用一个尺码。如果你不这样做,那也没什么好做的 您在这里所做的这种思考被称为“过早优化”。唐纳德

在Java中初始化
ArrayList
的最佳实践是什么

如果我使用
new
操作符初始化ArrayList,那么默认情况下,ArrayList将为10个存储桶分配内存。这是一个性能的打击

我不知道,也许我错了,但在我看来,如果我确定大小的话,我应该通过提及大小来创建一个
ArrayList

这是一个性能的打击

我不会担心“性能冲击”。Java中的对象创建速度非常快。您不太可能测量性能差异

如果你知道的话,一定要用一个尺码。如果你不这样做,那也没什么好做的

您在这里所做的这种思考被称为“过早优化”。唐纳德·克努斯说这是所有邪恶的根源


更好的方法是先让代码工作,然后再快速运行。使用手头的数据进行优化,这些数据会告诉您代码的速度有多慢。不要猜测——你可能错了。你会发现你很少知道瓶颈在哪里。

如果你已经知道你的ArrayList的大小(大约),你应该使用有容量的构造函数。但大多数情况下,开发人员并不知道列表中会有什么内容,因此如果容量为10,则对于大多数情况来说应该足够了


10个存储桶是一个近似值,不会对性能造成影响,除非您已经知道ArrayList包含大量元素,在这种情况下,始终调整数组大小的需要将对性能造成影响。

如果您知道要添加多少元素,请使用正确数量的对象初始化ArrayList。如果你没有,不要担心。性能差异可能无关紧要。

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

如果您真的在意,可以在构建和填充对象后调用。javadoc声明容量至少与列表大小一样大。如前所述,分配给ArrayList的内存不太可能是性能瓶颈,如果是,我建议您改用数组。

这是我能给您的最好建议:

  • 别担心。是的,您有几个选项可以创建
    ArrayList
    ,但是使用库提供的默认选项
    new
    ,这并不是一个坏选择,否则在没有说明更好的方法的情况下,将其作为每个人的默认选择是愚蠢的
  • 如果事实证明这是一个问题,那么您在分析时会很快发现它。当您分析应用程序的性能/内存问题时,这是查找问题的适当位置。当您第一次编写代码时,您不必担心这些东西--这是过早的优化--您只需担心编写好的、干净的代码,以及良好的设计
  • 如果您的设计是好的,那么您应该能够在不影响系统其余部分的情况下立即解决此问题。有效Java第二版,第52项:通过对象的接口引用对象。您甚至可以切换到
    链接列表
    ,或者任何其他类型的
    列表
    ,如果这是一种更好的数据结构的话。为这种灵活性而设计
  • 最后,有效的java第二版,项目1:考虑静态工厂方法而不是构造函数。如果实际上不需要新实例(例如
    Integer.valueOf
    并不总是创建新实例),您甚至可以将其与第5项结合使用:避免创建不必要的对象
相关问题
  • -深入了解类型推断
    静态
    工厂方法(也在中)

ArrayList
微观管理上 如果需要微观管理
ArrayList
,以下是一些具体提示:

  • 您可以使用设置列表的初始容量。如果需要,列表将自动增长到超出此容量
  • 当您准备填充/添加到
    ArrayList
    ,并且您知道元素的总数时,您可以使用(或直接使用上面的构造函数)来减少中间增长的数量。无论您是否这样做(如API中所保证的),每个
    add
    都将在摊销的固定时间内运行,因此这只能通过一个固定因素降低成本
  • 您可以尝试将存储使用率降至最低
这种微观管理通常是不必要的,但如果您认为(通过确凿的分析结果证明)值得这么做,您可以选择这样做

另见
  • -返回仅包含指定对象的不可变列表

    • 您不需要告诉ArrayList的初始大小。您始终可以轻松地添加/删除其中的任何元素

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

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

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

      然而,正如这里的大多数人所说,在进行某种分析之前,不应该担心速度

      在我看来,你可以参考这篇古老但很好的文章。

      是的,我同意。目前我们正在解决性能问题。根据要求,到目前为止,一切正常