`
frank-liu
  • 浏览: 1683811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArrayList.remove()的一个小细节

    博客分类:
  • java
 
阅读更多

不废话,先上代码:

 

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删除两个元素,比如10, 25。初步设想的代码如下:

 

col.remove(10);
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方法,分别定义如下:
public E remove(int index);

public boolean remove(Object o);
 
当我们传入int类型的时候,会自动被当成上面那个方法来调用。而下面那个移除某个特定元素的方法是需要传入一个Object对象。所以,为了移除制定的元素而不至于引起混淆的话,可以将传入的int先封装一下:
col.remove((Integer)10);
col.remove((Integer)25);
    这样结果就对了。

 

10
1
分享到:
评论
5 楼 793059909 2014-07-08  
frank-liu 写道
793059909 写道
重载有优先级?
837062099 写道
重载方法中,调用优先级最高的是最精确的方法。

这样的重载,确实很容易是调用者发生错误,以前我自己写的这样的方法,找了好久才发现这个错误。


因为在这里remove方法接收的参数是remove(Integer item),就是说如果我们传进来的参数是Integer类型的,那么就会调用这个删除指定元素的方法。而还有一个remove(int item)这个方法接收的参数是int类型的,和它最匹配的是一个int参数。在前面的代码里我们传进来的参数就是直接的一个int,所以和它最匹配的那个就是删除指定索引的那个。



package overload.special;

public class OverLoadTest {
	
	public void test(Object obj){
		System.out.println("Object:"+obj);
	}
	
	public void test(Integer integer){
		System.out.println("Integer:"+integer);
	}
	
	public void test(int int1){
		System.out.println("int:"+int1);
	}
	
	public void test(String str){
		System.out.println("String:"+str);
	}
	
	public static void main(String[] args) {
		OverLoadTest ot=new OverLoadTest();
		ot.test(1);
		ot.test("1");
	}
}

输出:
int:1
String:1

===》
优先级:
基本类型>对象
对象中 子类>父类,其中Object类的优先级最低


4 楼 frank-liu 2014-07-04  
793059909 写道
重载有优先级?
837062099 写道
重载方法中,调用优先级最高的是最精确的方法。

这样的重载,确实很容易是调用者发生错误,以前我自己写的这样的方法,找了好久才发现这个错误。


因为在这里remove方法接收的参数是remove(Integer item),就是说如果我们传进来的参数是Integer类型的,那么就会调用这个删除指定元素的方法。而还有一个remove(int item)这个方法接收的参数是int类型的,和它最匹配的是一个int参数。在前面的代码里我们传进来的参数就是直接的一个int,所以和它最匹配的那个就是删除指定索引的那个。
3 楼 793059909 2014-07-04  
重载有优先级?
837062099 写道
重载方法中,调用优先级最高的是最精确的方法。

这样的重载,确实很容易是调用者发生错误,以前我自己写的这样的方法,找了好久才发现这个错误。

2 楼 lizhensan 2012-03-10  
void  method(int a)
void  method(Integer a)

这两个方法是重装的方法,调用时不一样的。

1 楼 837062099 2012-03-09  
重载方法中,调用优先级最高的是最精确的方法。

这样的重载,确实很容易是调用者发生错误,以前我自己写的这样的方法,找了好久才发现这个错误。

相关推荐

    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