【问题标题】:Set Method of ArrayList throwing IndexOutOfBoundsExceptionArrayList 抛出 IndexOutOfBoundsException 的设置方法
【发布时间】:2016-04-04 05:47:34
【问题描述】:

在处理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, ...) 应该可以工作。

实际:抛出异常 IndexOutOfBoundsException

那么是设置方法导致问题吗?

【问题讨论】:

标签: java arrays arraylist


【解决方案1】:

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

set

参数

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

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

返回 乙 之前在指定位置的元素

投掷

IndexOutOfBoundsException

【讨论】:

    【解决方案2】:

    List test = new ArrayList(10); 创建 empty ArrayList 的原始类型 (Object),其初始容量(最初的列表容量,初始化长度为 10 的内部数组)不是与大小混淆(列表包含的元素数)。

    要了解更多,首先请注意ArrayList 只不过是 arraymanipulation 以动态更改数组的大小,而我们无法直接对数组进行操作。最终,它是一个 smart 数组。

    通过设置初始容量,我们告诉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 元素的列表,最好在开始时设置初始容量。如果您确定列表中肯定包含的最小元素数量,它会避免 resize 数组。

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

    这种方法的文档说,

    IndexOutOfBoundsException - 如果index 超出范围(index &lt; 0 || index &gt;= size())

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        test.set(5, "test"); 是引发此异常的语句,因为您的 ArrayList 为空(如果您到达该语句,size() 将返回 0),并且您无法设置第 i 个元素 if它还没有包含值。您必须在 ArrayList 中添加至少 6 个元素才能使 test.set(5, "test"); 有效。

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

        【讨论】:

        • 我更新了我的问题,之前没有正确解释,请现在检查
        • @ShowStopper 什么没有得到正确解释? ArrayList 初始化为 0 长度,无论其初始容量如何,除非您使用的构造函数使用另一个 Collection 的元素初始化 ArrayList。
        【解决方案5】:

        异常不是由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 类似,但更喜欢参数化列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-07
          • 2023-03-28
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          • 2013-05-20
          相关资源
          最近更新 更多