Java ArrayList索引超出范围异常
最近在使用arrayList时,我发现了一个奇怪的问题。我希望在arraylist中保留2个元素,并希望在元素0中保留object1,在元素1中保留object2 我在一个循环中决定这件事 当它碰巧将第一个元素添加到它的抛出indexOutofBounds时。根据Javadoc,索引大于它的大小Java ArrayList索引超出范围异常,java,arraylist,replace,indexoutofboundsexception,Java,Arraylist,Replace,Indexoutofboundsexception,最近在使用arrayList时,我发现了一个奇怪的问题。我希望在arraylist中保留2个元素,并希望在元素0中保留object1,在元素1中保留object2 我在一个循环中决定这件事 当它碰巧将第一个元素添加到它的抛出indexOutofBounds时。根据Javadoc,索引大于它的大小 public static void main(String[] args) { ArrayList<String> list = new ArrayList<
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing due to size is not set
list.add(0,"FIRSTITEM");
int postn=0;
for(String item:list){
System.out.println("Position "+postn+" :"+item);
postn++;
}
}
publicstaticvoidmain(字符串[]args)
{
ArrayList=新建ArrayList();
list.add(1,“SECONDITEM”);//未设置由于大小而引发的抛出
列表。添加(0,“第一项”);
int-postn=0;
用于(字符串项:列表){
系统输出打印项次(“位置“+postn+”:“+item”);
postn++;
}
}
然后我尝试将其他项目设置为0,1元素中的占位符,并尝试执行相同的操作
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add(0,"x");
list.add(1,"y");
list.add(1,"SECONDITEM");
list.add(0,"FIRSTITEM");
int postn=0;
for(String item:list){
System.out.println("Position "+postn+" :"+item);
postn++;
}
}
Output:
Position 0 :FIRSTITEM
Position 1 :x
Position 2 :SECONDITEM
Position 3 :y
publicstaticvoidmain(字符串[]args)
{
ArrayList=新建ArrayList();
列表。添加(0,“x”);
列表。添加(1,“y”);
增加(1,“第二项”);
列表。添加(0,“第一项”);
int-postn=0;
用于(字符串项:列表){
系统输出打印项次(“位置“+postn+”:“+item”);
postn++;
}
}
输出:
位置0:FIRSTITEM
位置1:x
立场2:第二项
位置3:y
如何克服这个问题。我发现的一种方法是删除索引中的元素并添加元素。有更好的选择吗。
publicstaticvoidmain(字符串[]args)
{
ArrayList=新建ArrayList();
列表。添加(0,“x”);
列表。添加(1,“y”);
列表。删除(1);
增加(1,“第二项”);
列表。删除(0);
列表。添加(0,“第一项”);
int-postn=0;
用于(字符串项:列表){
系统输出打印项次(“位置“+postn+”:“+item”);
postn++;
}
}
位置0:FIRSTITEM
立场1:第二项
.add()方法在给定位置插入元素,并相应地移动另一个元素
要覆盖特定索引处的值,必须使用.set(位置、值)
试试set方法
list.add(0,"x");
list.add(1,"y");
list.set(1,"SECONDITEM");
list.set(0,"FIRSTITEM");
现在它将只返回两个值。按此顺序呼叫时:
ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing due to size is not set
ArrayList list=new ArrayList();
列表。添加(1,“第二项”);//未设置因大小而导致的投掷
您正试图添加到位置“1”,但列表中尚未添加任何内容。我相信这就是为什么你会犯错误。相反,您可能只想使用:
ArrayList<String> list = new ArrayList<String>();
list.add("FIRSTITEM");
ArrayList list=new ArrayList();
列表。添加(“第一项”);
因为这是一个空列表。您也可以使用索引,但每次都必须递增。有道理吗?问题是。。。您试图以一种非预期的方式使用
列表。正如您所发现的,您不能设置或添加到当前大小范围之外的索引
如果您事先知道所需的大小,并且大小固定,那么使用字符串[]
是更好的选择
如果您确实想要/需要一个允许随机访问集的动态结构,而不考虑当前大小,请在需要时编写自己的方法来填充列表:
public static <T> void fillAndSet(int index, T object, List<T> list)
{
if (index > (list.size() - 1))
{
for (int i = list.size(); i < index; i++)
{
list.add(null);
}
list.add(object);
}
else
{
list.set(index, object);
}
}
publicstaticvoidfillandset(int索引、T对象、列表)
{
如果(索引>(list.size()-1))
{
对于(int i=list.size();i
Erm,不要使用ArrayList
?创建自己的LinkdList类来处理这种情况。或者在做任何索引特定的添加之前,在ArrayList中添加尽可能多的默认值。我有相同的问题,为什么?非常肯定OP知道这一点,因为他们在Q中说。我从一开始就知道大小,但我想从1开始初始化它(因此发生的事情很明显-这是测试中的数据集)。你对这种情况有什么想法吗?地图?:/并不是所有的元素都被设置了,其中一部分是空的。
public static <T> void fillAndSet(int index, T object, List<T> list)
{
if (index > (list.size() - 1))
{
for (int i = list.size(); i < index; i++)
{
list.add(null);
}
list.add(object);
}
else
{
list.set(index, object);
}
}