在Java中使用小型(1-10项)实例级集合

在Java中使用小型(1-10项)实例级集合,java,collections,Java,Collections,在用Java创建类的过程中,我经常发现自己在创建实例级集合时,我提前知道这些集合非常小——集合中的项不到10项。但我不知道提前的项目数,所以我通常选择动态集合(ArrayList、Vector等) class-Foo { ArrayList条=新的ArrayList(10); } 我的一部分一直在唠叨,对这么小的东西使用复杂的动态集合是浪费。有没有更好的方法来实现这样的事情?还是这是常态 注意,我没有受到任何(明显的)性能惩罚或类似的事情。这只是我想知道是否有更好的方法来做事情。开销非常小。可

在用Java创建类的过程中,我经常发现自己在创建实例级集合时,我提前知道这些集合非常小——集合中的项不到10项。但我不知道提前的项目数,所以我通常选择动态集合(ArrayList、Vector等)

class-Foo
{
ArrayList条=新的ArrayList(10);
}
我的一部分一直在唠叨,对这么小的东西使用复杂的动态集合是浪费。有没有更好的方法来实现这样的事情?还是这是常态


注意,我没有受到任何(明显的)性能惩罚或类似的事情。这只是我想知道是否有更好的方法来做事情。

开销非常小。可以编写一个混合数组列表,其中包含前几个项的字段,然后回过头来使用数组创建更长的列表

通过使用数组,可以完全避免列表对象的开销。为了更进一步,您可以将字段声明为对象,并避免对单个项使用数组


如果内存确实是一个问题,您可能希望忘记在底层使用对象实例。相反,在更大的粒度级别上使用更大的数据结构。

Java中的
ArrayList
类只有两个数据成员,一个是对
对象[]
数组的引用,另一个是如果不使用
ArrayList
则需要的大小。因此,不使用
ArrayList
的唯一优势是节省一个对象分配,这不太可能是一件大事


如果每秒都要创建和处理容器类的许多实例(扩展为
ArrayList
实例),那么垃圾收集搅动可能会有轻微问题,但如果发生这种情况,就需要担心。垃圾收集通常是你最不担心的事情。

为了保持简单,我认为这几乎不是问题。您的实现足够灵活,如果将来需求发生变化,您就不会被迫进行重构。此外,考虑到您的小数据集和Java集合API的高质量,为混合解决方案的代码添加更多逻辑是不值得的。

集合针对不可变/少量元素进行了优化。请参见
Lists.asList
API作为示例。

您所说的话本身没有错,但我不想做这些事情。以某种方式在object->array->ArrayList之间动态切换所涉及的复杂性是如此之大,而仅仅创建一个简单的ArrayList所需的成本是如此之小,以至于我认为这只是一个坏建议,它很少重要,但当它重要时,它是可以修复的。例如,javac做了一些奇怪的事情来保持字符串使用的内存很小,因此我们都能从更快、更小的编译中获益。当前的JVM在对象分配和垃圾收集方面进行了大量优化,但这几乎总是毫无根据的。
class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}