在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.asList
API为例。