6

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

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

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

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

4

4 回答 4

10

Java 中的ArrayList类只有两个数据成员,一个对Object[]数组的引用和一个大小——如果你不使用ArrayList. 因此,不使用 an 的唯一好处ArrayList是节省了一个对象分配,这不太可能成为大事。

ArrayList如果您每秒钟都在创建和处理许多容器类的实例(以及扩展的实例),那么您可能会遇到垃圾收集搅动的小问题——但如果它真的发生了,那就需要担心了。垃圾收集通常是您最不担心的事情。

于 2008-09-11T17:48:59.527 回答
3

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

于 2008-09-11T18:03:39.927 回答
2

Google Collections has collections optimized for immutable/small number of elements. See Lists.asList API as an example.

于 2008-09-11T18:57:58.253 回答
1

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

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

如果内存确实是个问题,您可能想忘记在低级别使用对象实例。而是在更大的粒度级别上使用更大的数据结构。

于 2008-09-11T17:45:18.443 回答