ArrayList索引超出范围异常

时间:2014-02-02 05:52:37

标签: java arraylist replace indexoutofboundsexception

最近在使用arrayList时我发现了一个奇怪的问题。我想在arraylist中保留2个元素,并希望将object1保留在element1中的元素0和object2中。

我在循环中决定这一点。

当碰巧添加第一个元素时抛出indexOutofBounds。根据java doc,索引大于它执行此操作的大小。

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++;
        }
    }

然后我尝试将其他项目设置为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

如何克服这个问题。我找到的一种方法是删除索引中的元素并添加元素。有没有更好的选择。

public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(0,"x");
        list.add(1,"y");
        list.remove(1);
        list.add(1,"SECONDITEM");
        list.remove(0);
        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

    Position 0 :FIRSTITEM
    Position 1 :SECONDITEM

3 个答案:

答案 0 :(得分:4)

.add()方法在给定位置插入元素并相应地移动其他元素

要覆盖特定索引处的值,您必须使用 .set(位置,值)

尝试set方法..

    list.add(0,"x");
    list.add(1,"y");

    list.set(1,"SECONDITEM");

    list.set(0,"FIRSTITEM");

现在它将只返回两个值。

答案 1 :(得分:0)


当你按此顺序打电话时:

ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing  due to size is not set

您正在尝试添加到位置“1”,但尚未添加任何内容。我相信这就是你得到错误的原因。相反,你可能只想使用:

ArrayList<String> list = new ArrayList<String>();
list.add("FIRSTITEM");

因为它是一个空列表。您也可以使用索引,但每次都必须增加。有意义吗?

答案 2 :(得分:0)

问题是......你试图以一种不打算使用的方式使用List。如您所知,您无法设置或添加超出当前大小范围的索引。

如果您事先知道所需尺寸并且尺寸固定,那么使用String[]是更好的选择。

如果你真的想要/需要一个允许随机访问集的动态结构而不管当前的大小,那么在需要时编写自己的方法来填充列表:

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