Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList的初始大小_Java_Arraylist_Indexoutofboundsexception - Fatal编程技术网

Java ArrayList的初始大小

Java ArrayList的初始大小,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,您可以通过执行以下操作来设置ArrayList的初始大小 ArrayList<Integer> arr=new ArrayList<Integer>(10); 因为它会导致越界异常 如果无法访问分配的空间,设置初始大小有什么用 add函数被定义为add(int-index,Object-element),因此我不会添加到索引10。10是AL的初始容量,而不是大小(0)。当您将有很多元素时,您应该将初始容量提到某个较高的值,因为这样可以避免在不断添加元素时扩展容量的开销。

您可以通过执行以下操作来设置ArrayList的初始大小

ArrayList<Integer> arr=new ArrayList<Integer>(10);
因为它会导致越界异常

如果无法访问分配的空间,设置初始大小有什么用


add函数被定义为
add(int-index,Object-element)
,因此我不会添加到索引10。

10是AL的初始容量,而不是大小(0)。当您将有很多元素时,您应该将初始容量提到某个较高的值,因为这样可以避免在不断添加元素时扩展容量的开销。

您将数组列表的大小与其容量混淆了:

  • 大小是列表中元素的数量
  • 容量是列表在不重新分配内部结构的情况下可以容纳的元素数量
调用
newarraylist(10)
时,设置的是列表的初始容量,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命开始为空

向数组列表中添加十个元素的一种方法是使用循环:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}
for(int i=0;i<10;i++){
arr.add(0);
}

完成此操作后,现在可以修改索引0..9处的元素。

现在列表中没有元素,因此当列表不存在时,无法将其添加到列表的索引5中。您将列表的容量与其当前大小混淆

只要打电话:

arr.add(10)

将整数添加到数组列表中时,
数组列表的容量与其大小不同大小等于
数组列表
(以及任何其他
列表
实现)中包含的元素数

容量只是用于内部存储
ArrayList
元素的基础数组的长度,并且始终大于或等于列表的大小

在列表上调用
set(index,element)
时,
index
与列表元素的实际数量(=大小)(在代码中为零,因此抛出
AIOOBE
),而不是与数组长度(=容量)(这是特定于
ArrayList
的实现细节)相关

set
方法对于所有
List
实现都是通用的,例如
LinkedList
,它实际上不是由数组实现的,而是作为一个链接的条目链实现的


编辑:您实际上使用的是
添加(索引,元素)
方法,而不是
设置(索引,元素)
,但这里的原则是相同的。

我想您的问题的确切答案是:

在ArrayList上设置初始大小可以减少内部内存重新分配的次数。 该列表由一个数组支持。如果指定初始容量0,则在第一次插入元素时,必须调整内部阵列的大小。
如果您大致知道列表将容纳多少个元素,则设置初始容量将减少使用列表时发生的内存重新分配次数。

虽然您的arraylist的容量为10,但实际列表中没有元素。add方法用于将元素插入到实际列表中。因为它没有元素,所以不能将元素插入到索引5中。

如果需要具有预定义大小的列表,还可以使用:

List<Integer> arr = Arrays.asList(new Integer[10]);
List arr=Arrays.asList(新整数[10]);

如果要添加具有索引的元素,可以使用数组

    String [] test = new String[length];
    test[0] = "add";

如果您想在
ArrayList
中添加10项,您可以尝试:

for (int i = 0; i < 10; i++)
    arr.add(i);
for(int i=0;i<10;i++)
arr.add(i);

如果已声明数组大小变量,则将使用变量
size
而不是数字“10”

ArrayList myList=new ArrayList(10)


/*声明arraylist的初始功能只是在内部节省切换时间;当我们在内部添加元素时,它会检查容量以增加容量,您可以先在0索引处添加元素,然后在1索引处添加元素,以此类推*/

如果您想使用集合。填充(列表,obj);为了用重复对象填充列表,您也可以使用

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
arraylistarr=newarraylist(Collections.nCopies(10,0));

该行将10次0复制到您的ArrayList中

这可能有助于某些人-

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
arraylistintegerarraylist=newarraylist(Arrays.asList(newinteger[10]);

我也遇到了类似的问题,只要知道arrayList是List接口的一个可调整大小的数组实现,我还希望您可以向任意点添加元素,但至少可以选择定义初始大小。 无论如何,您可以先创建一个数组,然后将其转换为如下列表:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);
int索引=5;
int size=10;
整数[]数组=新整数[大小];
数组[索引]=值;
...
列表=数组。asList(数组);

List List=Arrays.asList(新整数[size]);
list.set(索引、值);

做得太晚了,但是在Java8之后,我个人觉得下面的
API方法更简洁,可以作为一种替代方法

比如说,

Arrays.stream(新的int[size]).boxed().collect(收集器.toList())

如果
大小
是所需的
列表
大小,而不包含该大小,则
列表
中的所有元素都初始化为
0


(我做了一个快速搜索,没有在发布的任何答案中看到
——请随时告诉我这个答案是否多余,我可以删除它)

我在
上的两分钱。我觉得还是用这个比较好

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());
具有输入任何初始值的灵活性。

contrib

List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());
List destinations=Collections.nCopies(source.size(),D
  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);
IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());
List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());