在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException
Posted
技术标签:
【中文标题】在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException【英文标题】:IndexOutOfBoundsException when adding to ArrayList at index 【发布时间】:2014-06-10 21:24:07 【问题描述】:以下代码出现异常Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
。但不明白为什么。
public class App
public static void main(String[] args)
ArrayList<String> s = new ArrayList<>();
//Set index deliberately as 1 (not zero)
s.add(1,"Elephant");
System.out.println(s.size());
更新
我可以让它工作,但我试图理解这些概念,所以我将声明更改为下面但也没有工作。
ArrayList<String> s = new ArrayList<>(10)
【问题讨论】:
如果您仔细阅读堆栈跟踪,您会看到错误是在添加时,而不是在请求大小时。我已经相应地编辑了你的标题。 你说得对,我看到了异常at java.util.ArrayList.add
。
【参考方案1】:
顺便说一句,ArrayList<String> s = new ArrayList<>(10);
将 initialCapacity 设置为 10。
由于Arraylist的容量是可调的,它只让java知道大概的容量,尽量避免扩容带来的性能损失。
【讨论】:
【参考方案2】:你可以这样初始化一个ArrayList的大小(不是容量):
ArrayList<T> list = new ArrayList<T>(Arrays.asList(new T[size]));
在你的情况下:
ArrayList<String> s = new ArrayList<String>(Arrays.asList(new String[10]));
这将创建一个包含 10 个空元素的 ArrayList,因此您可以在大小(索引 0-9)内以随机顺序添加元素。
【讨论】:
Arrays.asList(new String[10]) - 已经返回一个列表。所以把它包起来有点没用。变量 s 应该是原始类型 List,而不是实现 ArrayList。 OP专门询问了ArrayList,Arrays.asList返回一个固定大小的List(***.com/questions/2965747/…) 使用接口肯定是更好的做法,但我们不知道OP是否需要ArrayList的特定方法 @Bojan Petkovic,Arrays.asList(new String[10]) 将返回一个 AbstractList。 AbstractList 不支持操作 add(index, value)。所以它需要被包装(通过非抽象类型的 List 实现)。 @imnd_neel ArrayList 没有实现 List 的 AbstractList 不支持的单一方法。 List 支持 add(index, value):docs.oracle.com/javase/8/docs/api/java/util/… ListArrayList 索引从 0(零)开始
您的数组列表大小为 0,并且您在第一个索引处添加字符串元素。如果不在第 0 个索引处添加元素,则无法添加下一个索引位置。这是错误的。
所以,简单地把它变成
s.add("Elephant");
或者你可以
s.add(0,"Elephant");
【讨论】:
【参考方案4】:对于 Android:
如果您需要使用一个有很多空白的列表,最好使用SparseArray
以存储内存(ArrayList
将有很多null
条目)。
使用示例:
SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
如果您添加顺序键,例如 1、2、3、5、7、11、13...,请使用 list.append()
。
如果您添加非顺序键,例如 100、23、45、277、42...,请使用 list.put()
。
如果您的列表将包含数百个项目,最好使用HashMap
,因为查找需要二进制搜索,而添加和删除需要在数组中插入和删除条目。
【讨论】:
【参考方案5】:add(int index, E element)
API 说,您的数组列表大小为零,并且您正在向第一个索引添加一个元素
投掷:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
请改用boolean add(E e)
。
更新基于问题更新
我可以让它工作,但我正在努力理解这些概念,所以我 将声明更改为下面,但也没有用。
ArrayList<String> s = new ArrayList<>(10)
当您调用new ArrayList<Integer>(10)
时,您将列表的初始容量设置为 10,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命开始时是空的。
【讨论】:
这就是我迷失方向的地方。我的索引1
不小于零,大小为1
,因此索引不大于大小。【参考方案6】:
不要在列表中直接将索引添加为 1 如果您想在列表中添加值,请像这样添加 s.add("大象"); 默认列表大小为 0 如果您将在列表中添加任何元素,大小将自动增加 您不能直接在列表第一个索引中添加。 //s.add(0, "大象");
【讨论】:
【参考方案7】:您必须从 0、1 等开始向 ArrayList 连续添加元素。
如果您需要将元素添加到特定位置,您可以执行以下操作 -
String[] strings = new String[5];
strings[1] = "Elephant";
List<String> s = Arrays.asList(strings);
System.out.println(s);
这将产生sollowing输出
[null, Elephant, null, null, null]
【讨论】:
【参考方案8】:如果你真的想在索引 1 处添加“大象”,那么你可以在索引 0 处添加另一个(例如 null)条目。
public class App
public static void main(String[] args)
ArrayList<String> s = new ArrayList<>();
s.add(null);
s.add("Elephant");
System.out.println(s.size());
或者将调用更改为 .add
以在索引 0 处指定 null 并在索引 1 处指定大象。
【讨论】:
【参考方案9】:ArrayList 不能自扩展。要在索引 1 处添加项目,您应该有元素 #0。
【讨论】:
【参考方案10】:您的ArrayList
为空。用这一行:
s.add(1,"Elephant");
您试图在不存在的ArrayList
(第二个位置)的索引1
处添加"Elephant"
,因此它会抛出一个IndexOutOfBoundsException
。
使用
s.add("Elephant");
改为。
【讨论】:
我换成ArrayList<String> s = new ArrayList<>(10)
怎么样
@Bala 它会给你一个IndexOutOfBoundsException
。该构造函数设置ArrayList
的初始容量,而不是大小。所以大小仍然是 0。并且来自 API:Throws IndexOutOfBoundsException if the index is out of range (index < 0 || index > size())
以上是关于在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章
尝试将相同的字符串添加到 ArrayList 类时出现 nullpointerexception [重复]
运行时出现该字符串未被识别为有效的 DateTime。有一个从索引 0 处开始的未知字。
添加联系人时出现 OperationApplicationException
Oracle:使用 to_lob 从 user_ind_expressions 转换 column_expression 时出现 ORA-00932