就像标题一样。做这样的事情是可以的:
HashMap<Integer, Object> foo = new HashMap<>();
或者可能有更好的容器允许在任何索引处添加值?说“更好”时我的意思是“有更好的性能”,然后“使用更少的RAM”。
ArrayList<Object> bar = new ArrayList<>();
bar.add(10_000, new Object());
想要在上面的代码中执行类似的操作,但这当然不适用于ArrayList。我要做的清单很稀疏;索引被传播 - 这就是我考虑HashMap而不是ArrayList的原因。
问候。
答案 0 :(得分:4)
您的问题非常通用,根据您指定的详细信息,HashMap和ArrayList似乎都符合您的要求,您只会对性能感到困扰。表演有各方面:
所以这取决于你的要求。
编辑: 如果数据有很多差异,那么HashMap就是最佳选择。如果使用Array或ArrayList,则由于数据存储之间存在大量空白,因此内存消耗将变高。插入的HashMap成本高于Array,但是当你对RAM有所了解时,你应该使用HashMap。
答案 1 :(得分:2)
您正在做的(实际上)是使用HashMap
来表示稀疏数组。
这可能是一个合理的实现选择,但它的功效取决于您要实现的目标,以及数组的属性。
如果数组足够稀疏,那么您将使用HashMap
而不是简单数组来节省内存。然而,与非稀疏阵列相比,HashMap
使用大约一个数量级的更多内存而不是数组。最重要的是,get
上的put
和HashMap
操作比索引一个简单数组要慢大约一个数量级。
此外,根据数组的大小和稀疏性,有一些表示使用显着 less 空间而不是HashMap
(例如Android稀疏数组类),代价是获取/放置不会扩展的性能。