设置不总是使用的 ArrayList 的初始容量的最佳做法是什么?

Lim*_*awk 3 java constructor arraylist capacity

我有一些类的ArrayList字段只是有时使用。我通常像这样初始化这些字段:

private List<Widget> widgets = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我了解使用重载构造函数来设置初始容量,所以我想知道是否应该这样声明这些字段:

private List<Widget> widgets = new ArrayList<>(0);
Run Code Online (Sandbox Code Playgroud)

困境在于,如果我用 0 初始化列表,那么列表将始终必须重新初始化自己才能添加一项​​。但是,如果我使用默认构造函数,它的默认容量为 10,那么我可能会有一堆项目(并且可能有很多)正在浪费未使用容量的内存。

我知道你们中的一些人会拒绝询问“多久一次”和“你期待多少项目”,但我真的在寻找“最佳实践”方法。所有事情都相等,是否应该使用有时使用的列表(0)()在列表上进行初始化?

始终初始化列表是我们部门的政策,因此我可能不会简单地将列表保留为null,此外,这只会回避问题。

phi*_*686 5

过早的优化是万恶之源。- D. 克努斯。

这似乎是一种“性能问题”,实际上从未对性能产生任何影响。一方面,您有多确定这些空列表实际上已初始化?我怀疑大多数现代编译器会延迟对象的初始化,直到它们确定将调用它们。因此,如果您传递 no arg 构造函数,除非将某些内容添加到列表中,否则它很可能永远不会被使用。另一方面,如果您使用 0 参数构造函数,它保证它必须调整它使用的每个参数的大小。

这是性能优化的三大定律

  1. 永远不要假设你知道编译后的代码实际上在做什么,或者你可以比编译器更好地进行小的优化。
  2. 永远不要在不使用分析器找出瓶颈所在的情况下进行优化。如果您认为您知道,请参阅规则编号 (1)。
  3. 除非您的应用程序有性能问题,否则不要打扰。然后参考规则(2)。

如果您以某种方式仍然相信自己了解编译器,请查看以下问题:为什么处理排序数组比处理未排序数组更快?