1. 程式人生 > >arraylist執行remove時注意移除int和Integer的區別

arraylist執行remove時注意移除int和Integer的區別

先寫一段簡單的程式碼

ArrayList<Integer> col = new ArrayList<Integer>();  
System.out.println("Initial size: " + col.size());  
for(int i = 0; i < 20; i++)  
    col.add(i + 10);

上面這段程式碼建立一個Interger型別引數的ArrayList.
於是考慮到要從ArrayList刪除兩個元素,比如5, 25。初步設想的程式碼如下:

col.remove(5);
col.remove(25);

但是執行結果呢?

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 25, Size: 20
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.remove(ArrayList.java:445)
    at CollectionBasics.main(CollectionBasics.java:54)

從錯誤中間可以看到,提示的是訪問陣列索引越界了。怎麼會這樣呢?很顯然,傳入的10,25被當成索引而不是要移除的元素。
察看java doc裡面才發現,裡面有兩個remove方法,分別定義如下:

public E remove(int index);  

public boolean remove(Object o);

當我們傳入int型別的時候,會自動被當成上面那個方法來呼叫。而下面那個移除某個特定元素的方法是需要傳入一個Object物件。所以,為了移除制定的元素而不至於引起混淆的話,可以將傳入的int先封裝一下:

col.remove((Integer)10);  
col.remove((Integer)25);  

好了,這樣就達到目的了。