Java:存储到ArrayList的任意索引的最佳方式

我知道我不能将值存储在尚未使用的ArrayList的索引处,即小于大小。 换句话说,如果myArrayList.size()是5,那么如果我尝试做的话

myArrayList.set(10, "Hello World") 

我会得到一个越界错误。 但我的应用需要这个。 除了在每个中间槽中存储null的循环之外,还有更优雅的方法吗?

它看起来像我:

  • Vector中的行为相同
  • 如果我需要能够随机访问(即在pos X处的元素),那么我的选择是Vector和ArrayList。
  • 我可以使用HashMap并使用索引作为键,但这实在是效率低下。

那么看起来像普通情况的优雅解决方案是什么呢? 我肯定错过了什么…

我可以使用HashMap并使用索引作为键,但这实在是效率低下。

要看。 如果您使用的索引非常稀疏,那么使用Map可能要好得多。 如果指数趋向于紧密相连,我认为没有比用空值填充它更好的方法了。 只需为它编写一个实用程序函数,您可以反复使用它,而不是在需要的地方重复循环,如下所示:

 private void padTo(List list, int size) { for (int i=list.size(); i 

您可以使用TreeMap ,它按TreeMap按自然顺序排序。

在这里,您可以将值保持为索引。 您可以插入任何值,它不需要按顺序排列。 这似乎是最简单的解决方案。

您可以使用Map 。 具体来说,如果你使用HashMap ,它也将是O(1) – 尽管它会比ArrayList慢。

听起来你想要一个普通的数组:

  • 你想要随机访问
  • 您想指定一些大尺寸

如果你肯定必须使用列表而不是地图,那么最好覆盖arraylist的add和set方法,先在索引中放入null。 没有其他更好的方式IMO

HashMap的效率可能远低于您的想象,尝试它。 否则,我认为没有办法比循环和填充null更优雅。 如果你想要至少优雅的说明,那么你总是可以inheritanceArrayList并添加一个expandingSet(position,value)方法来隐藏所有的循环等等。 也许这不是一个选择? 如果不只是在其他地方有一个实用工具方法,但这不是很好的imho,虽然它也适用于其他类型的列表我猜…

也许包装类可能是两个世界中最好的,或者它可能会产生不必要的开销……

如果你正在寻找一个稀疏数组(大多数索引都是空的),某种类型的地图(可能是一个HashMap)将是你最好的选择。 任何arrays式解决方案都将被强制为所有空索引保留空间,这不是很节省空间,并且HashMap对于大多数正常目的而言足够快。

如果最终将数组填满n,则需要在循环中添加空值以获得所需的索引。 你可以通过给它最初想要存储的元素数量的初始容量来提高效率(这可以防止ArrayList需要自己resize)。 new ArrayList(n)可以正常工作。 不幸的是,除了在制作循环时添加内容之外,没有简单的方法可以使它开始时具有一定的大小。