用Java制作整数键映射是否可以?

时间:2013-06-16 12:41:34

标签: java map arraylist indexing

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

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

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

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

想要在上面的代码中执行类似的操作,但这当然不适用于ArrayList。我要做的清单很稀疏;索引被传播 - 这就是我考虑HashMap而不是ArrayList的原因。

问候。

2 个答案:

答案 0 :(得分:4)

您的问题非常通用,根据您指定的详细信息,HashMap和ArrayList似乎都符合您的要求,您只会对性能感到困扰。表演有各方面:

  1. 如果您的数据是连续的或较少传播[即整数或多或少依次]那么我会选择ArrayList,因为与HashMap相比,插入成本更低。
  2. 如果您的数据有很多差异,或者如果您要执行大量删除以及插入,那么我会选择HashMap。
  3. 所以这取决于你的要求。

    编辑: 如果数据有很多差异,那么HashMap就是最佳选择。如果使用Array或ArrayList,则由于数据存储之间存在大量空白,因此内存消耗将变高。插入的HashMap成本高于Array,但是当你对RAM有所了解时,你应该使用HashMap。

答案 1 :(得分:2)

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

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

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

此外,根据数组的大小和稀疏性,有一些表示使用显着 less 空间而不是HashMap(例如Android稀疏数组类),代价是获取/放置不会扩展的性能。