`

ArrayList.remove()的一个小细节

    博客分类:
  • java
 
阅读更多

转至:http://shmilyaw-hotmail-com.iteye.com/blog/1447631

 

ArrayList除了下面小细节以外,还有个小细节。

 

就是下面删除array 10个以上的元素。

首先我是这么写的:

 

 

for(int i = 9;i<array.size;i++) array.remove(i);

一开始有50个数据,然后 删除 后还有30个,我就郁闷了,突然想到之前也出现过这种情况。得从最后一个开始删除 ,删除i=10的数后,array删除index为10的后面的会往前走一步。删除 i=11 是删除最初的i=12.

解决方法如下:从最后个开始删除 。

 

for(int i = array.size()-1;i>9;i--) array.remove(i);
 

 

Java代码 
  1. ArrayList<Integer> col = new ArrayList<Integer>();  
  2. System.out.println("Initial size: " + col.size());  
  3. for(int i = 0; i < 20; i++)  
  4.     col.add(i + 10);  

 

显然,上面这段代码再简单不过了,建立一个Interger类型参数的ArrayList.

于是考虑到要从ArrayList删除两个元素,比如10, 25。初步设想的代码如下:

 

Java代码 
  1. col.remove(10);  
  2. col.remove(25);  

 

   基于这种设想的原因是,既然ArrayList<Integer>里的类型是Integer,我传入一个int的应该可以自动实现autoboxing.那么,如果和设想的一样,col中的10和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方法,分别定义如下:
Java代码 
  1. public E remove(int index);  
  2.   
  3. public boolean remove(Object o);  
 
当我们传入int类型的时候,会自动被当成上面那个方法来调用。而下面那个移除某个特定元素的方法是需要传入一个Object对象。所以,为了移除制定的元素而不至于引起混淆的话,可以将传入的int先封装一下:
Java代码 
  1. col.remove((Integer)10);  
  2. col.remove((Integer)25);  
    这样结果就对了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics