设置抛出IndexOutOfBoundsException的ArrayList的方法

时间:2015-12-30 09:12:47

标签: 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());
}

我不确定为什么java会抛出此异常。

我期望的行为:test.size()应该返回10并且set(5,...)应该有效。

ACTUAL:抛出异常IndexOutOfBoundsException

是设置方法导致问题吗?

5 个答案:

答案 0 :(得分:20)

test.set(5, "test");是抛出此异常的语句,因为您的ArrayList为空(如果您已完成该语句,size()将返回0),并且您可以'如果第i个元素尚未包含值,则设置它。您必须向ArrayList添加至少6个元素才能使test.set(5, "test");生效。

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

答案 1 :(得分:8)

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));

作为旁注,you should never use raw typesList类似,但总是更喜欢参数化列表。

答案 2 :(得分:3)

List test = new ArrayList(10);创建一个空列表,其容量为10个元素。它不包含第6个位置的元素,因此您将无法在此位置设置元素。

答案 3 :(得分:2)

List test = new ArrayList(10);创建具有初始容量的 ArrayList原始类型(Object)(最初列表容量,初始化内部数组,长度为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
}

您可以相应地增加或减少它,假设您确定需要带有20元素的列表,最好在开始时设置初始容量。如果您确定列表中肯定有的最小元素数,它可以避免调整数组

test.set(5, "test");方法 替换 元素在此处的特定位置,它将用5替换索引test处的元素。但是我们的列表是空的,它没有任何元素。

此方法的文档说明,

  

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

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

答案 4 :(得分:0)

使用指定的元素替换此列表中指定位置的元素。

set

参数

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

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

返回 Ë 先前在指定位置的元素

抛出

IndexOutOfBoundsException