arraylist執行remove時注意移除int和Integer的區別
阿新 • • 發佈:2019-02-03
先寫一段簡單的程式碼
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);
好了,這樣就達到目的了。