用Java中的新运算符初始化ArrayList?
在Java中初始化用Java中的新运算符初始化ArrayList?,java,arraylist,Java,Arraylist,在Java中初始化ArrayList的最佳实践是什么 如果我使用new操作符初始化ArrayList,那么默认情况下,ArrayList将为10个存储桶分配内存。这是一个性能的打击 我不知道,也许我错了,但在我看来,如果我确定大小的话,我应该通过提及大小来创建一个ArrayList 这是一个性能的打击 我不会担心“性能冲击”。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
,以下是一些具体提示:
- 您可以使用设置列表的初始容量。如果需要,列表将自动增长到超出此容量
- 当您准备填充/添加到
,并且您知道元素的总数时,您可以使用(或直接使用上面的构造函数)来减少中间增长的数量。无论您是否这样做(如API中所保证的),每个ArrayList
都将在摊销的固定时间内运行,因此这只能通过一个固定因素降低成本add
- 您可以尝试将存储使用率降至最低
- -返回仅包含指定对象的不可变列表
- ArrayList的初始化非常快。别担心
- 从ArrayList添加/删除元素也非常快。别担心
- 如果你发现你的代码运行太慢。首先要责备的是你的算法,不是冒犯。机器规格、操作系统和语言也确实参与其中。但与您的算法参与相比,他们的参与被认为是微不足道的
- 您不需要告诉ArrayList的初始大小。您始终可以轻松地添加/删除其中的任何元素
如果这是性能问题,请记住以下事项:
如果您不知道
ArrayList
的大小,那么最好使用LinkedList
,因为LinkedList.add()
操作是恒定速度的
然而,正如这里的大多数人所说,在进行某种分析之前,不应该担心速度
在我看来,你可以参考这篇古老但很好的文章。
是的,我同意。目前我们正在解决性能问题。根据要求,到目前为止,一切正常