Java ArrayList的起始大小

Java ArrayList的起始大小,java,collections,Java,Collections,我想像使用标准数组一样使用ArrayList(或其他集合) 具体来说,我希望它从初始大小(比如大小)开始,并能够立即明确地设置元素 e、 g 可以写 array.set(4, "stuff"); 但是,以下代码引发IndexOutOfBoundsException: ArrayList<Object> array = new ArrayList<Object>(SIZE); array.set(4, "stuff"); //wah wahhh ArrayList数组=

我想像使用标准数组一样使用ArrayList(或其他集合)

具体来说,我希望它从初始大小(比如大小)开始,并能够立即明确地设置元素

e、 g

可以写

array.set(4, "stuff");
但是,以下代码引发IndexOutOfBoundsException:

ArrayList<Object> array = new ArrayList<Object>(SIZE);
array.set(4, "stuff"); //wah wahhh
ArrayList数组=新的ArrayList(大小);
数组.set(4,“填充”)//哇哇
我知道有几种方法可以做到这一点,但我想知道是否有一种方法是人们喜欢的,或者是更好的收藏。目前,我使用的代码如下所示:

ArrayList<Object> array = new ArrayList<Object>(SIZE);

for(int i = 0; i < SIZE; i++) {
   array.add(null);
}

array.set(4, "stuff"); //hooray...
1) Create a vector. 2) If the vector is full, create a vector with the old vector size + as much you want. 3) Copy all items from the old vector to your new vector. This way, you will not waste memory.
ArrayList数组=新的ArrayList(大小);
对于(int i=0;i
我问这个问题的唯一原因是因为我在一个可能会运行很多次(数万次)的循环中这样做。鉴于ArrayList的大小调整行为是“未指定的”,我希望它不要浪费任何时间来调整自身大小,也不要浪费内存在支持它的数组中额外的、未使用的点上。不过,这可能是一个没有实际意义的问题,因为我将用对array.set()的调用完全填充数组(几乎总是数组中的每个单元格),并且永远不会超过容量


我宁愿使用普通阵列,但我的规格要求我使用集合。

初始容量意味着阵列有多大。这并不意味着那里有元素。那么大容量


实际上,您可以使用一个数组,然后使用
Arrays.asList(array)
来获得一个集合。

初始容量意味着数组有多大。这并不意味着那里有元素。那么大容量

事实上,您可以使用数组,然后使用
Arrays.asList(array)
来获取集合。

我重新编译一个HashMap


HashMap hash = new HasMap();
hash.put(4,"Hi");
我重新编译一个HashMap


HashMap hash = new HasMap();
hash.put(4,"Hi");

是的,hashmap将是一个伟大的想法。
另一种方法是,您可以使用大容量启动阵列

是的,hashmap将是一个很好的想法。
另一种方法是,您可以使用大容量启动阵列

考虑到你的重点是记忆。然后,您可以手动执行Java arraylist所做的操作,但它不允许您根据需要调整大小。因此,您可以执行以下操作:

ArrayList<Object> array = new ArrayList<Object>(SIZE);

for(int i = 0; i < SIZE; i++) {
   array.add(null);
}

array.set(4, "stuff"); //hooray...
1) Create a vector. 2) If the vector is full, create a vector with the old vector size + as much you want. 3) Copy all items from the old vector to your new vector. This way, you will not waste memory. 1) 创建一个向量。 2) 如果向量已满,请创建一个旧向量大小+所需大小的向量。 3) 将所有项目从旧向量复制到新向量。 这样,您就不会浪费内存。
或者可以实现列表(而不是向量)结构。我认为Java已经有了一个。

考虑到您的主要观点是内存。然后,您可以手动执行Java arraylist所做的操作,但它不允许您根据需要调整大小。因此,您可以执行以下操作:

ArrayList<Object> array = new ArrayList<Object>(SIZE);

for(int i = 0; i < SIZE; i++) {
   array.add(null);
}

array.set(4, "stuff"); //hooray...
1) Create a vector. 2) If the vector is full, create a vector with the old vector size + as much you want. 3) Copy all items from the old vector to your new vector. This way, you will not waste memory. 1) 创建一个向量。 2) 如果向量已满,请创建一个旧向量大小+所需大小的向量。 3) 将所有项目从旧向量复制到新向量。 这样,您就不会浪费内存。

或者可以实现列表(而不是向量)结构。我认为Java已经有了一个。

这几乎保证了我在数组中有一堆浪费的空间,不是吗?是的,你浪费了更多的内存,但你不必像arraylist那样再次浪费时间排序。此外,哈希映射不是集合。不使用(哈希)映射:映射上的每个put()只为特定的键/值对创建一个条目。重要的一点是,“4”实际上是一个键,而不是索引。因此,如果执行
map.put(4,…);地图放置(-1000,…);map.put(999,…)
映射将只包含三个值,例如,
map.size()
将返回3。在我的用例中,排序是绝对没有问题的。这几乎可以保证数组中有大量浪费的空间,不是吗?是的,您会浪费更多内存,但您不必像arraylist那样再次浪费时间进行排序。此外,HashMaps不是集合。不使用(Hash)映射:映射上的每个put()只为特定的键/值对创建一个条目。重要的一点是,“4”实际上是一个键,而不是索引。因此,如果执行
map.put(4,…);地图放置(-1000,…);map.put(999,…)
映射将只包含三个值,例如,
map.size()
将返回3。在我的用例中,排序是绝对没有问题的。理解,关于容量。至于使用Arrays.asList(),请考虑一下。。。但是,我(好的,库)必须在每次结束时迭代整个数组。我想这并不比迭代大小时间来添加所有空值更糟糕?不要太担心线性复杂性。你可能是对的。我几乎没有发帖,因为这是一个相当离奇的话题。我的实现很好,只是看起来。。。错。你可以使用@Bozho的建议创建一个包含任意大小的空数组的列表。asList(new Object[size])^^^^我喜欢这个,因为它基本上做了相同的事情,而且看起来更少。。。不合时宜。=]理解,关于:能力。至于使用Arrays.asList(),请考虑一下。。。但是,我(好的,库)必须在每次结束时迭代整个数组。我想这并不比迭代大小时间来添加所有空值更糟糕?不要太担心线性复杂性。你可能是对的。我几乎没有发帖,因为这是一个相当离奇的话题。我的实现很好,只是看起来。。。错。你可以使用@Bozho的建议创建一个包含任意大小的空数组的列表。asList(new Object[size])^^^^我喜欢这个,因为它基本上做了相同的事情,而且看起来更少。。。不合时宜。=]