Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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抛出IndexOutOfBoundsException的集合方法_Java_Arrays_Arraylist - Fatal编程技术网

Java ArrayList抛出IndexOutOfBoundsException的集合方法

Java ArrayList抛出IndexOutOfBoundsException的集合方法,java,arrays,arraylist,Java,Arrays,Arraylist,在处理ArrayList时,我发现在使用带有initialCapacity的构造函数设置数组的初始大小后,使用set()将引发异常,尽管创建了数组,但大小设置不正确 使用ensureCapacity()也不起作用,因为它基于elementData数组,而不是size 由于使用ensureCapacity()的静态默认容量还有其他副作用 唯一可行的方法是在使用构造函数后尽可能多地使用add() 请检查下面的代码 import java.util.ArrayList; import java.uti

在处理
ArrayList
时,我发现在使用带有
initialCapacity
的构造函数设置数组的初始大小后,使用
set()
将引发异常,尽管创建了数组,但大小设置不正确

使用
ensureCapacity()
也不起作用,因为它基于
elementData
数组,而不是
size

由于使用
ensureCapacity()
的静态
默认容量
还有其他副作用

唯一可行的方法是在使用构造函数后尽可能多地使用add()

请检查下面的代码

import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {

    List test = new ArrayList(10);
    test.set(5, "test");
    System.out.println(test.size());
}
我不知道为什么java会抛出这个异常

我期望的行为:
test.size()
应该返回10,而set(5,…)应该可以工作

实际:引发异常
IndexOutOfBoundsException

那么是set方法导致了问题吗?

test.set(5,“test”)是引发此异常的语句,因为
ArrayList
为空(
size()
将返回
0
,如果该语句不包含值,则无法设置第i个元素。您必须向
ArrayList
中添加至少6个元素,以便
test.set(5,“test”)必须是有效的


newarraylist(10)
不会创建大小为10的
ArrayList
。它创建一个空的
ArrayList
,其初始容量为10。

异常不是由
test.size()
引发的,而是由
test.set(5,“test”)引发的。这是因为您正在索引5处设置一个元素,但列表当前为空

List test = new ArrayList(10);
不创建用10个
null
元素初始化的列表。它创建了一个初始容量为10个元素的列表,即支持数组的大小为10,但列表本身仍然为空

如果要使用10个
null
元素初始化列表,可以使用

List<String> list = new ArrayList<>(Collections.nCopies(10, null));
List List=newarraylist(Collections.nCopies(10,null));


作为旁注,类似于
列表
,但始终更喜欢参数化列表。

列表测试=新的ArrayList(10)创建空列表,该列表的容量为10个元素。它在第6个位置不包含元素,因此您将无法在此位置设置元素。

列表测试=新的ArrayList(10)创建原始类型(
对象
)的
数组列表
,初始容量(列表容量,初始化长度为10的内部数组)不与大小(列表包含的元素数)混淆

要了解更多信息,请首先注意,
ArrayList
只不过是对数组的操作,以动态更改数组的大小,而我们无法直接使用数组。最终,它是一个智能阵列

通过设置初始容量,我们告诉
ArrayList
最初创建数组的大小
10
(默认初始容量为
10

这就是构造器所做的

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//creates initial array
}
public数组列表(int initialCapacity){
超级();
如果(初始容量<0)
抛出新的IllegalArgumentException(“非法容量:”+
初始容量);
this.elementData=新对象[initialCapacity];//创建初始数组
}
您可以相应地增加或减少它,比如说您确定需要包含
20个
元素的列表。最好在开始时设置初始容量。若您确定列表中肯定包含的元素的最小数量,那个么就可以避免调整数组的大小

test.set(5,“test”)方法替换特定位置处的元素,这里它将用
测试替换索引
5
处的元素。但是我们的列表是空的,它没有任何元素

这种方法的文件说明

IndexOutOfBoundsException
-如果
索引超出范围(
索引<0
|
索引>=size()


请注意,列表的大小为
0
,因此索引(
5
)大于大小(
0
)。

将此列表中指定位置的元素替换为指定元素

set
参数

索引 int:要替换的元素的索引

元素 E:存储在指定位置的元件

返回 E 先前位于指定位置的元素

投掷

IndexOutOfBoundsException

我更新了我的问题,之前没有正确解释,请检查now@ShowStopper有什么没有解释清楚?ArrayList初始化为0长度,而不管其初始容量如何,除非您使用的构造函数使用另一个集合的元素初始化ArrayList。此处没有“ArrayList.size()的特殊行为”。你还没到那里。好吧,我会把标题改成可能的副本,我不相信那里提供的答案,我认为ERAN提供的答案更简单,更容易解释。因此,这不是一个重复的问题,这是一个更清晰的问题和答案的重复