2008-09-11 62 views
6

在Java中创建类时,我经常发现自己创建的实例级集合提前知道的数量非常少 - 集合中只有不到10个项目。但是我不知道事件的数量,所以我通常会选择一个动态集合(ArrayList,Vector等)。在Java中使用小型(1-10项)实例级集合

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

我的一部分一直唠叨我,它的浪费使用复杂的动态集合中大小事这个小。有没有更好的方式来实现这样的事情?或者这是常态?

请注意,我没有遇到任何(显着的)性能处罚或类似的情况。这只是我想知道是否没有更好的方式来做事情。

回答

11

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

如果您正在创建和你的容器类的很多,很多情况下的处置(通过扩展您的ArrayList实例)每一秒,你威力有垃圾收集一个小问题,客户流失,但是这是值得忧虑如果它曾经发生过。垃圾收集通常是您最担心的问题。

1

开销很小。可以编写一个混合数组列表,其中包含前几个项目的字段,然后回退到使用数组获取更长列表。

通过使用数组可以完全避免列表对象的开销。要进一步硬派,你可以声明这个字段为Object,并且避免单个项目的数组。

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

+0

你说的没有错,本身,但我不想做任何这些事情。以某种方式动态地在object - > array - > ArrayList之间进行复杂性的复杂性非常好,而且创建一个简单ArrayList的代价非常小,我认为这只是一个不好的建议 – 2008-09-11 17:53:26

+0

这很少重要,但是当它很重要时它是可以修复的。例如,javac确实很奇怪,为的是让字符串的内存很小,所以我们都可以从更快,更小的编译中受益。 – 2008-10-04 17:51:04

3

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