设置抛出IndexOutOfBoundsException的ArrayList的方法

Jok*_*ker 12 java arrays arraylist

在处理时ArrayList,我发现在使用构造函数设置了数组的初始大小之后initialCapacity,set()尽管创建了数组,但是使用将抛出异常,但是未正确设置大小.

使用ensureCapacity()将无法工作,因为它基于elementData数组而不是size.

还有其他副作用静态的,因为DEFAULT_CAPACITYensureCapacity().

使这项工作的唯一方法是在使用构造函数后使用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());
}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么java会抛出这个异常.

我期望的行为:test.size()应该返回10并且设置(5,...)应该工作.

实际:抛出异常IndexOutOfBoundsException.

那么导致问题的set方法是什么?

Era*_*ran 20

test.set(5, "test");抛出此异常的语句,因为您ArrayList的空是空的(如果你有这个语句size()就会返回0),如果它没有包含值,你就不能设置第i个元素.您必须添加至少6个元素,你ArrayList为了test.set(5, "test");有效.

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

  • @ShowStopper什么没有正确解释?除非您使用的构造函数使用另一个Collection的元素初始化ArrayList,否则ArrayList将初始化为0长度,而不管其初始容量如何. (6认同)

Tun*_*aki 8

该异常没有被抛出test.size(),但通过test.set(5, "test");.这是因为您在索引5处设置元素,但列表当前为空.

List test = new ArrayList(10);
Run Code Online (Sandbox Code Playgroud)

不会创建使用10个null元素初始化的列表.它创建一个初始容量为10个元素的列表,即支持数组的大小为10,但列表本身仍为空.

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

List<String> list = new ArrayList<>(Collections.nCopies(10, null));
Run Code Online (Sandbox Code Playgroud)

作为旁注,您不应该使用类似的原始类型,List但总是更喜欢参数化列表.