`

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);  
    这样结果就对了。

 

分享到:
评论

相关推荐

    Java中ArrayList的removeAll方法详解

    ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为它可能会导致性能问题。 1. ...

    arrayList.zip

    ArrayList的设计基于一个可调整大小的数组,它允许我们在列表的任何位置进行添加、删除和查找元素等操作。这个压缩包"arrayList.zip"可能包含了关于ArrayList的源码分析、实现细节以及使用示例。 线性表是一种基本...

    ArrayList.java

    如果多个线程同时访问一个ArrayList实例,至少线程修改的一个列表结构,它必须保持外部同步。 (结构上的修改是指添加或删除一个或多个元件,或明确地调整大小背衬阵列的操作;仅设置元素的值不是结构修改。)这是一...

    ArrayList.md

    如果多个线程同时访问一个`ArrayList`实例,并且至少有一个线程修改了该列表,则必须保持外部同步。 7. **序列化支持**:`ArrayList`实现了`Serializable`接口,可以通过序列化机制保存其状态。 8. **初始化与预...

    ArrayList源码.zip

    ArrayList的核心实现是通过一个Object类型的数组来存储元素。当添加元素时,如果当前容量不足,ArrayList会自动扩容,通常扩容为原来的1.5倍。这种设计使得ArrayList在插入元素时有较好的性能表现,但删除元素特别是...

    Java list.remove( )方法注意事项

    `remove()`方法是`List`接口中的一个关键操作,用于从列表中删除指定的元素或根据索引移除元素。在使用`remove()`方法时,需要注意一些重要的细节以避免潜在的问题和错误。下面将详细介绍`List.remove()`方法的两种...

    模拟java ArrayList Iterator

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,它是一个动态数组,可以存储任意类型的对象。ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们...

    java面向对象-API(接口)与集合(ArrayList).docx

    - **定义**:`String` 类表示不可变的字符序列,即一旦创建了一个 `String` 对象,它的值就不能改变。 - **用途**:常用于存储固定的文本数据,如数据库连接字符串、文件路径等。 - **特点**: - 不可变性提高了...

    第二章 ArrayList源码解析1

    如`new ArrayList()`创建一个空的ArrayList,或者`new ArrayList(initialCapacity)`指定初始容量。源码中,elementData数组的初始容量为0,当添加元素时会自动扩容。 2. **添加对象**: 使用`add(E e)`方法将对象...

    硬核ArrayList源码分析,答应我每天看一遍好么

    ArrayList是Java集合框架中的一个重要组成部分,它是基于动态数组实现的列表。在Java 1.8版本中,ArrayList的实现细节和内部工作原理对于理解其性能和行为至关重要。本文将深入探讨ArrayList的源码,解析其实现逻辑...

    斗地主洗牌发牌算法

    这是一个非常适合初学者学习编程逻辑和算法的实例,特别是对于Java编程语言的学习者。斗地主是一种广受欢迎的扑克游戏,通常由三名玩家进行,每名玩家会收到17张牌,留三张作为底牌。在游戏开始前,洗牌和发牌是必不...

    【IT十八掌徐培成】Java基础第10天-04.List-迭代器-对象等价性.zip

    2. **迭代器(Iterator)**:在Java中,迭代器是一种设计模式,用于遍历集合中的元素,提供了`hasNext()`方法检查是否还有下一个元素,以及`next()`方法获取下一个元素。迭代器模式使得代码对具体的集合实现细节透明...

    java代码-使用集合ArrayList对字符串进行存储和管理

    要创建一个ArrayList,可以使用以下语法: ```java ArrayList&lt;String&gt; stringList = new ArrayList(); ``` 这里,我们定义了一个存储字符串的ArrayList。 3. 添加元素: 使用`add()`方法向ArrayList中添加...

    66丨迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?1

    假设我们有一个包含元素"a", "b", "c", "d"的ArrayList,使用迭代器遍历时,游标初始指向第一个元素"a"。如果在遍历过程中删除元素"a",由于ArrayList的删除操作会移动后面的元素来填补空位,原本指向元素"b"的游标...

    hashtable的使用

    在这个例子中,`NoSortHashTable`继承了`Hashtable`,并使用了一个`ArrayList`来存储键的顺序。当添加新元素时,除了在哈希表中添加之外,还会将键添加到`ArrayList`中。当移除元素时,也会同步更新`ArrayList`。...

    Java中Vector与ArrayList的区别详解

    Java中的ArrayList和Vector都是列表(List)接口的实现类,它们在功能上相似,但在细节上存在一些重要的差异。这两个类都是基于数组实现的,但它们的性能特点、线程安全性和扩容策略有所不同。 1. **扩容策略**: ...

    Java小程序 很小的一个程序

    在这个"Java小程序"中,我们看到了一个名为`IteratorDemo`的文件,这通常表示这是一个关于Java迭代器(Iterator)的示例。迭代器是Java集合框架的一部分,它提供了一种遍历集合元素的方法,而不必暴露底层的实现细节...

    ListView+CheckBox UI 完美版。实现 全选 、 全不选 、 删除等功能.zip

    适配器中要包含一个ArrayList,用于存储数据和CheckBox的状态。 ```java public class CustomAdapter extends ArrayAdapter&lt;String&gt; { private ArrayList&lt;String&gt; items; private ArrayList&lt;Boolean&gt; ...

Global site tag (gtag.js) - Google Analytics