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

Collection接口的remove和List接口的remove的差别

    博客分类:
  • java
阅读更多

刚看书上一段代码,觉得输出的结果有点奇怪,查看了jdk的api后,恍然大悟。
代码:

Collection<String> con = new ArrayList<String>();
con.add("a");
con.add("b");
con.add("c");
con.remove(0);
System.out.println(con.size());
		
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.remove(0);
System.out.println(list.size());


欲知所以然,请查下api。(ps:jdk版本为1.5以上,因为1.5以上才支持泛型和自动装箱)

 

分享到:
评论
19 楼 huang5787826 2011-03-04  
Collection<String> con = new ArrayList<String>();  
con.add("a");  
con.add("b");  
con.add("c");  
con.remove(0);  
System.out.println(con.size());  

Collection 的 remove的方法不是只能移除一个对象~ 咋可以con.remove(0);这样
18 楼 wangdongjie03 2011-03-02  
哪里命名不规范了吗,跟功能不沾边
17 楼 zhangyou1010 2011-02-28  
clayton0 写道
zhangyou1010 写道
webee 写道
你呀肯定不看接口编程的,这是两个不同的重载方法!
	Collection<String> con = new ArrayList<String>();
		con.add("a");
		con.add("b");
		con.add("c");
		con.remove(0);
		System.out.println(con.size());

		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.remove(Integer.valueOf(0));
		System.out.println(list.size());


这里没涉及到重载。是接口里的方法规定不一样而已。



呵呵,不叫重载,叫什么,一样的方法名,只是参数不一样,一个是Object,一个是int


谢谢指出,确实是重载,是我弄错了。
16 楼 gch_h 2011-02-28  
发这个贴只能说明你水平有多低,
老夫来教教你
Collection有一个remove(Object o)方法,他删除一个用相等的对象
Collection集合里边是没有顺序的,所以没有办法跟进索引删除
Collection<String> con = new ArrayList<String>();
con.add("a");
con.add("b"); 
con.add("c");
con.remove(0);
System.out.println(con.size());
这段代码是删除一个对象0,但是集合中根本就没有0这个对象,所以就不删除。如果你要删除a必须这样写con.remove("a");

List接口有两个remove方法
remove(Object o)
remove(int index)
下面代码中是使用了第二个重载的方法
List<String> list = new ArrayList<String>(); 
list.add("a"); 
list.add("b"); 
list.add("c"); 
list.remove(0); 
System.out.println(list.size());
这段代码要删除a也可以这样写
list.remove('a');
15 楼 sd_zyl 2011-02-28  
public interface Collection<E> extends Iterable<E> {
    boolean add(E e);
    boolean remove(Object o);
    boolean contains(Object o);
    //...
}

JDK1.6中源代码。个人感觉似乎这个接口设计不是很合适,为什么不是:
boolean remove(E o);
boolean contains(E o);

如果那个接口是泛型的话,lz的问题编译时候就发现了~~~
14 楼 clayton0 2011-02-28  
zhangyou1010 写道
webee 写道
你呀肯定不看接口编程的,这是两个不同的重载方法!
	Collection<String> con = new ArrayList<String>();
		con.add("a");
		con.add("b");
		con.add("c");
		con.remove(0);
		System.out.println(con.size());

		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.remove(Integer.valueOf(0));
		System.out.println(list.size());


这里没涉及到重载。是接口里的方法规定不一样而已。



呵呵,不叫重载,叫什么,一样的方法名,只是参数不一样,一个是Object,一个是int
13 楼 zhangyou1010 2011-02-28  
yangfuchao418 写道
一个是在集合中删除指定的对象(传具体的对象);一个是在集合中删除指定位置的元素(传下标)。

呵呵,如果在智能编程工具中,如eclipse中,最好的办法,其实看传的参数结构就知道不同了。根本不用查api


问题是jdk1.5以后有了装箱机制,传入基本数据类型,也当做Object处理了。
12 楼 onlylau 2011-02-28  
原来Collection类中只有remove(E e),而List中除了有继承来的remove(E e);还有自己重载实现的remove(int index);方法

所以上面方法调用的con.remove(0);编译器把它当成从con中删除一个Intege类实例(new Integer(0))

谢谢LZ分享,自己都把这个区别给忘了
11 楼 yangfuchao418 2011-02-28  
一个是在集合中删除指定的对象(传具体的对象);一个是在集合中删除指定位置的元素(传下标)。

呵呵,如果在智能编程工具中,如eclipse中,最好的办法,其实看传的参数结构就知道不同了。根本不用查api
10 楼 sswh 2011-02-28  
E remove(int index)
          移除列表中指定位置的元素(可选操作)。

boolean remove(Object o)
          从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。

这种情况真的是编程中的陷阱。。
9 楼 Reset 2011-02-28  
List<String> con = new ArrayList<String>();
8 楼 zhangyou1010 2011-02-28  
webee 写道
你呀肯定不看接口编程的,这是两个不同的重载方法!
	Collection<String> con = new ArrayList<String>();
		con.add("a");
		con.add("b");
		con.add("c");
		con.remove(0);
		System.out.println(con.size());

		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.remove(Integer.valueOf(0));
		System.out.println(list.size());


这里没涉及到重载。是接口里的方法规定不一样而已。
7 楼 hotapple 2011-02-27  
Collection:
remove(Object o)
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
6 楼 晨星★~雨泪 2011-02-27  
yangyi 写道
命名不规范的例证

非也非也
5 楼 chenchao051 2011-02-27  
liubey 写道
细节决定成败~


确实是这样。遗憾的是,这样的情况还不是少数。
4 楼 webee 2011-02-27  
你呀肯定不看接口编程的,这是两个不同的重载方法!
	Collection<String> con = new ArrayList<String>();
		con.add("a");
		con.add("b");
		con.add("c");
		con.remove(0);
		System.out.println(con.size());

		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.remove(Integer.valueOf(0));
		System.out.println(list.size());
3 楼 yangyi 2011-02-26  
命名不规范的例证
2 楼 liubey 2011-02-26  
细节决定成败~
1 楼 houfeng0923 2011-02-26  
3
2
对比才知道呀。呵呵

相关推荐

    Java集合框架Collection接口.pdf

    在Java中,Collection接口是一个顶层接口,它有两个主要的子接口:List和Set。其中,List是一个有序的集合,可以包含重复的元素;而Set是一个不重复的集合,元素是无序的。 Collection接口的常用方法 1、add(Object ...

    Java集合框架List接口.pdf

    List接口有多个实现类,其中比较常用的是ArrayList和LinkedList。ArrayList是一个基于动态数组实现的List,它可以随机访问元素,并且在末尾添加元素非常快速,但在中间插入或删除元素则需要移动其他元素,效率较低。...

    Implement with Class and Collection a List Collection with a

    Implement with Class and Collection a List Collection with add and remove data elements.

    JAVA集合(List,Set,Map)

     · List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。 · Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。 · ...

    JAVA.SE List,collections,set接口

    List接口继承Collection接口,元素有序,有索引,可重复 collection接口有八种常见的方法 add remove size contains clear isEmpty toArray Iterator 没有特有方法 list特有方法 add 添加 remove删除 set修改 get...

    Collection学习笔记——每天一个Java小技巧

    它提供了更具体的子接口的实现,如set和list. Collection集合常用方法 方法名 说明 boolean add(E e) 添加元素 boolean remove(Object o) 从集合中移除指定的元素 void clear() 清空集合中的元素 ...

    Java 最常见的 208 道面试题:第二模块答案

    19. Collection 和 Collections 有什么区别? 20. List、 Set、 Map 之间的区别是什么? 21. HashMap 和 Hashtable 有什么区别? 22. 如何决定使用 HashMap 还是 TreeMap? 23. 说一下 HashMap 的实现原理? 24. 说...

    collection-1.2.1

    js模仿JAVA 集合工具类的基本操作,里面包装有Map List/* * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, value) 向MAP中增加元素(key, value) * remove...

    java-basic:java基础测试-java8

    1.核心接口:Iterator(迭代器接口)Iterable(可迭代接口) -&gt; Collection(集合接口)-&gt; List(列表,线性表接口) :ArrayList、LinkedList-&gt; Set(元素不重复的集合接口):HashSet、TreeSet-&gt; Queue(队列): ...

    2.Java集合-Collection1

    对于例子:对于执行的remove操作,会调用A的equals方法一次与集合元素进行比较,如果该equals()方法以某个集合元素作为参数是返回true,list

    史上最全java面试,103项重点知识,带目录

    19. Collection 和 Collections 有什么区别? 9 20. List、Set、Map 之间的区别是什么? 9 21. HashMap 和 Hashtable 有什么区别? 10 22. 如何决定使用 HashMap 还是 TreeMap? 10 23. 说一下 HashMap 的实现原理?...

    数据结构与算法分析Java语言描述(第二版)

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    java5 1.4.1 使用object表示泛型 1.4.2 基本类型的包装 1.4.3 使用接口类型表示泛型 1.4.4 数组类型的兼容性 1.5 利用java5泛性实现泛型特性成分 1.5.1 简单的泛型类和接口 1.5.2 自动装箱/拆箱....

    数据结构与算法分析-Java语言描述(第2版)_1_2

    java5 1.4.1 使用object表示泛型 1.4.2 基本类型的包装 1.4.3 使用接口类型表示泛型 1.4.4 数组类型的兼容性 1.5 利用java5泛性实现泛型特性成分 1.5.1 简单的泛型类和接口 1.5.2 自动装箱/拆箱....

    Java容器.xmind

    Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) E set​(int index, E element) E get​(int index) 底层数组实现,查询快,...

    数据结构与算法分析_Java语言描述(第2版)]

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析 Java语言描述第2版

    表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...

    数据结构与算法分析_Java语言描述(第2版)

    1.5.1 简单的泛型类和接口 1.5.2 自动装箱/拆箱 1.5.3 带有限制的通配符 1.5.4 泛型static方法 1.5.5 类型限界 1.5.6 类型擦除 1.5.7 对于泛型的限制 1.6 函数对象 小结 练习 参考文献 第2章 算法分析 2.1 数学...

    JAVA–集合

    集合框架 集合按照其存储结构可以分为两大类,单列集合java.util....3.public boolean remove(E e):把指定的对象从集合中删除。 4.public boolean contains(E e):判断集合中是否包含指定对象。 5.public boolean i

Global site tag (gtag.js) - Google Analytics