尽管在列表的容量内添加了ArrayList IndexOutOfBoundsException

时间:2015-02-04 06:58:27

标签: java

我有以下代码

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(1, 555);
}

并使用10个元素初始化,但我得到了异常

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0   
   at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:612)  
   at java.util.ArrayList.add(ArrayList.java:426)   
   at ListTest.main(ListTest.java:9)

虽然代码工作正常

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(0, 555);
}

为什么有人可以解释我?以及如何解决问题我想在我的代码中将项目放在第1,第2或第5位?

9 个答案:

答案 0 :(得分:9)

  

用10个元素初始化

不,不是。它的初始化内部缓冲区大小为10,但这主要是一个实现细节。列表的大小仍为0,因为您可以在list.size()来电之前打印出add来确认。

区分&#34;缓冲区中的空间量准备好接受更多元素而不复制&#34;和&#34;列表的大小&#34;。来自add documentation

  

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

此处size()为0,1 > 0,因此例外。

在假设它是错误的框架(或编译器)之前,您应该始终检查文档。

  

如何解决问题我想在我的代码中将项目放在第1,第2或第5位?

要么需要先添加足够的元素,例如

for (int i = 0; i < 10; i++) {
    list.add(null);
}
list.set(1, 555);
list.set(2, 500);
list.set(5, 200);

请注意,这些是设置操作,而不是添加 - 它不清楚您是否真的要插入或修改。

您应该使用数组。例如:

int[] array = new int[10];
array[1] = 555;
array[2] = 500;
array[5] = 200;

在这两种情况下,理解索引是从0开始非常重要 - 因此list.set(1, 555)会更改列表的第二个元素。您希望list.set(0, 555)更改第一个元素。这同样适用于数组。

答案 1 :(得分:3)

这是你的答案: public void add(int index, E element) {

的代码段
 if (index > size || index < 0)
        throw new IndexOutOfBoundsException(
        "Index: "+index+", Size: "+size);

基本上,当您执行new ArrayList()时,列表的大小将为0。由于您的索引 更多而不是size,因此您获得了IndexOutOfBoundsException

答案 2 :(得分:1)

您必须逐渐向列表中添加元素,列表将自动扩展。

如果您想在特定位置添加某个元素,并且您知道所需项目数量的长度;您可以使用Integer数组并在之后将其转换为列表,例如

public static void main(String []args){
    Integer []fixedLengthArray = new Integer[5];
    fixedLengthArray[1] = 3;
    List<Integer> intList = Arrays.asList(fixedLengthArray);
    for(int i= 0;i<intList.size();i++)System.out.println("Value of index "+i+":"+intList.get(i));
}

输出将是:

索引0的值:null 指数1:3的价值 索引2的值:null 索引3的值:null 索引4的值:null

答案 3 :(得分:0)

虽然该方法被称为add,但它实际上是一个插入操作。你基本上是在告诉Java,把它放在列表中的第一个项目后面。并且Java正在回复&#39;列表中没有第一项&#39;。

答案 4 :(得分:0)

所有它的拳头将在

上产生编译错误
List<Integer> list = new ArrayList<>(); 

代表ArrayList<Integer>()

and it is initialize with 10 elements你这样做了。?

我们看到,它没有用10个元素进行初始化,实际上它是空的,为什么当你尝试在索引1上添加一些内容时,它会在线上给出IndexOutOfBound

list.add(0, 555);

答案 5 :(得分:0)

public static void main(String[] args) {
     List<Integer> list = new ArrayList<>(1);
     list.add(0, 555);
}

此代码将有所帮助。如果索引位置中有数据,则可以调用带索引的add方法。

答案 6 :(得分:0)

因为,在第二个代码片段,零是第一个索引。但是在第一个代码片段中,一个不是第一个索引,并且没有为您的索引分配任何内存。

你必须这样做;

public static void main(String[] args) {
             List<Integer> list = new ArrayList<>();
             list.add(0, 555); //Correct
             list.add(1, 55); //Correct
             list.add(2, 525); //Correct
             list.add(5, 55235); // Not-correct  ! 
        }

创建列表并使用默认值分配所有索引。然后使用您想要的索引。

public static void main(String[] args) {
             List<Integer> list = new ArrayList<>();
             for(int i=0; i<10; i++)
             {
                 list.add(null);//or default value like -99
              }
             list.add(0, 555); //Correct
             list.add(1, 55); //Correct
             list.add(2, 525); //Correct
             list.add(5, 55235); //correct  ! 
        }

就这样做

int[] array = new int[10];

答案 7 :(得分:0)

这是因为你不会从树中获得水果,直到你植物树这么简单。

初始化列表时,它是一个空列表,可由list.size()验证,它将返回0,现在列表中有0个元素,并且您正在尝试访问1 index,所以它给你例外

来自Java Docs

void add(int index,
       E element)

将指定元素插入此列表中的指定位置(可选操作)。将当前位置元素 (如果有的话)和任何后续元素移动到右侧(将其添加到索引中)。

Throws:

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

答案 8 :(得分:0)

您的“列表”仍然是一个ArrayList 所以你不能改变它的索引(通常,arraylist的索引必须从0开始)。因此,当你输入“list.add(1,555)”时,它会抛出一个错误。

简单list.add(555)

您可以使用Map,SortedMap,HashMap,TreeMap代替ArrayList。这些将值存储为Key - Value。

Hashtable<Integer,Integer> list = new Hashtable<>();
list.put(1, 555);

HashMap<Integer,Integer> list2 = new HashMap<Integer,Integer>();
list2.put(3, 555);

希望这有帮助!