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

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

我内心的一部分一直在抱怨,对于这么小的东西使用复杂的动态集合是一种浪费。有没有更好的方法来实现这样的事情?或者这是常态?

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

有帮助吗?

解决方案

ArrayList Java 中的类只有两个数据成员,一个是对 Object[] 数组和大小——如果你不使用数组,你无论如何都需要它 ArrayList. 。所以不使用的唯一优点 ArrayList 正在保存一个对象分配,这不太可能是一件大事。

如果您正在创建和处置容器类的许多实例(并且通过扩展您的 ArrayList 实例)每一秒,你 可能 垃圾收集流失有一个小问题,但如果发生的话就值得担心。垃圾收集通常是您最不用担心的。

其他提示

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

谷歌收藏 具有针对不可变/少量元素进行优化的集合。看 Lists.asList 以 API 为例。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top