7

就像标题一样。可以做这样的事情吗:

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

或者也许有更好的容器允许在任何索引处添加值?当说“更好”时,我的意思是“具有更好的性能”,然后是“更少的 RAM 使用”。

ArrayList<Object> bar = new ArrayList<>();
bar.add(10_000, new Object());

想要在上面的代码中做类似的事情,但这当然不适用于 ArrayList。我想做的清单很稀疏;索引是分散的——这就是我考虑 HashMap 而不是 ArrayList 的原因。

问候。

4

2 回答 2

4

您的问题非常笼统,从您指定的详细信息来看,似乎 HashMap 和 ArrayList 都符合您的要求,您只关心性能。性能有多个方面:

  1. 如果您的数据是连续的或较少分布[即整数在序列中或多或少],那么我会选择 ArrayList,因为与 HashMap 相比,插入成本更低。
  2. 如果您的数据有很多分布,或者如果您要在插入的同时执行大量删除,那么我会选择 HashMap。

所以这取决于你的要求。

编辑:如果数据有很多传播,那么 HashMap 是要走的路。如果您使用 Array 或 ArrayList ,那么由于数据存储之间存在大量间隙,您的内存消耗将变得很高。HashMap 的插入成本比 Array 高,但是当您担心 RAM 时,您应该使用 HashMap。

于 2013-06-16T13:22:07.587 回答
3

你正在做的(实际上)是用来HashMap表示一个稀疏数组。

这可能是一个合理的实现选择,但其效果取决于您要实现的目标以及数组的属性。

如果数组足够稀疏,那么您将使用 aHashMap而不是简单数组来节省内存。然而,与非稀疏数组相比,aHashMap使用的内存大约比数组多一个数量级。最重要的是,对 a 的getandput操作HashMap比索引一个简单的数组要慢一个数量级。

此外,根据数组的大小和稀疏性,有些表示使用的空间比 a (例如 Android 稀疏数组类)要HashMap得多,但代价是 get/put 性能也无法扩展。

于 2013-06-16T14:50:33.153 回答