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

时间:2020-03-05 18:51:40  来源:igfitidea点击:

在用Java创建类时,我经常发现自己创建了实例级的集合,而我知道这些实例将非常小,少于集合中的10个项目。但是我不知道项目的数量,所以我通常选择动态集合(ArrayList,Vector等)。

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

我的一部分一直在烦我,对这么小的东西使用复杂的动态集合是很浪费的。有没有更好的方法来实现这样的事情?还是这是常态?

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

解决方案

回答

开销很小。可以编写一个混合数组列表,该列表具有前几个项目的字段,然后退回使用较长列表的数组。

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

如果确实存在内存问题,那么我们可能希望忘记在低级使用对象实例。而是以较大的粒度使用较大的数据结构。

回答

Java中的" ArrayList"类只有两个数据成员,即对" Object []"数组的引用和一个大小,如果不使用" ArrayList",则无论如何都需要它。因此,不使用" ArrayList"的唯一好处是节省了一个对象分配,这不太可能成为大问题。

如果我们每秒创建和处理许多很多容器类实例(并通过扩展ArrayList实例),那么垃圾收集流失可能会出现一些小问题,但是如果它发生的话,则需要担心。垃圾回收通常是我们最省心的事情。

回答

为了使事情简单,我认为这几乎不是问题。实现具有足够的灵活性,以至于将来需求发生变化时,也不会被迫进行重构。而且,考虑到小型数据集和Java的Collection API的高质量,为混合解决方案在代码中添加更多的逻辑是不值得的。

回答

Google馆藏针对不可变/少量元素进行了优化。以Lists.asListAPI为例。