在Java中创建整数键映射是否可以?

7
就像标题所说的那样。我可以这样做吗:

这是一个类似的问题。是否可以像这样创建:

HashMap<Integer, Object> foo = new HashMap<>();

也许有更好的容器可以在任何索引处添加值?当说“更好”时,指的是“性能更好”,然后是“使用更少的RAM”。
ArrayList<Object> bar = new ArrayList<>();
bar.add(10_000, new Object());

我想做类似于上面代码的操作,但是对于ArrayList这样的集合是无法实现的。我想要创建的列表是稀疏的,索引是分散的 - 所以我在考虑使用HashMap而不是ArrayList。

谢谢。


7
没问题,你可以像你描述的那样使用HashMap。例如可以用它来创建一个"稀疏"数组。 - Hovercraft Full Of Eels
4
你可以毫无问题地这样做,但是请注意整数将 不会 被排序;如果你想要它们被排序,请使用 TreeMap。如果你想要一些更好性能的替代方案,GNU Trove 可以帮助。 - fge
我知道我可以做到,但我想问是否有更好的方法 :) 谢谢 @fge,我会看看 GNU Trove(尽管我更喜欢内置类 :) ) - m4tx
"更好"是一个主观的词汇。在哪些标准下才能称之为"更好"呢? - jtahlborn
3
如果你想使用更少的内存,考虑使用TIntObjectHashMap代替Integer对象包装器,因为它支持原始的int类型键。 - Peter Lawrey
显示剩余5条评论
2个回答

4
你的问题比较笼统,从你提供的细节来看,HashMap和ArrayList都符合你的要求,你只关心性能。性能有多个方面:
1. 如果你的数据是连续的或者较少分散(例如整数大致上是按顺序排列的),那么我会选择ArrayList,因为插入的成本比HashMap低。
2. 如果你的数据非常分散,或者你需要频繁地进行删除和插入操作,那么我会选择HashMap。
所以这取决于你的需求。
编辑:如果数据非常分散,则应选择HashMap。如果使用Array或ArrayList,则由于数据存储之间存在许多间隙,内存消耗将变得很高。HashMap插入的成本比Array高,但是由于你关心内存,应该选择HashMap。

我的数据分布很广 :) 我已经将这个信息添加到问题中了。 - m4tx
我会选择HashMap。 - Lokesh

3
你正在做的事情实际上是使用HashMap来表示一个稀疏数组。这可能是一个合理的实现选择,但其效果取决于你所要实现的目标以及数组的属性。如果数组足够稀疏,那么使用HashMap而不是简单数组可以节省内存。然而,与非稀疏数组相比,HashMap使用大约一个数量级更多的内存。除此之外,HashMap上的get和put操作大约比索引简单数组慢一个数量级。此外,根据数组的大小和稀疏程度,存在使用比HashMap更少空间的表示方法(例如Android稀疏数组类),但代价是get/put性能无法很好地扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接