黑马程序员技术交流社区

标题: 关于集合删除元素的问题! [打印本页]

作者: 王永彬    时间: 2013-1-17 23:26
标题: 关于集合删除元素的问题!
本帖最后由 王永彬 于 2013-1-18 07:03 编辑

在集合中删除某个元素的时候,为什么还要再写一次new关键字呢?如:System.out.println(ts.remove(new R(-2)));而不是ts.remove(R(-2))?
作者: 黄锦成    时间: 2013-1-17 23:44
R(-2),如果R是类名,这个是语法错误了。使用new R(-2)是因为在R中重写了hashcode和equals方法,自定义比较内容,所以使用new不会出错
作者: 王少雷    时间: 2013-1-18 00:05
System.out.println(ts.remove(new R(-2)))
根据这代码。应该是个链表类 的泛型<R>集合 ,remove(对象),
R(-2)这个代表什么?不能代表对象吧?
创建对象开空间就是要new 出来。。。不管你对象里面写的什么参型的构造方法。。。
作者: 王永彬    时间: 2013-1-18 07:01
标题: RE: 关于集合删除元素的问题!
王少雷 发表于 2013-1-18 00:05
System.out.println(ts.remove(new R(-2)))
根据这代码。应该是个链表类 的泛型集合 ,remove(对象),
R(-2) ...

我想我明白了!谢谢!
作者: 折纸时代    时间: 2013-1-18 19:40
本帖最后由 司懿卓 于 2013-1-18 19:42 编辑

new R(-2) : 应该是创建了一个 Field 为int 型的对象.
因为,你在添加到集合中时,是 ts.add(new R(-2));这样添加的. new R(-2)没有引用,是临时创建的对象.
所以你在删除时,不能直接删除R (-2).  所以只能创建一个相同的对象用来删除. 就是 ts.remove(new R(-2));
这个应该是set集合, 是无序的,不可重复的,只能通过集合元素本身来访问.
所以,这个集合的 equals 方法和hashCode方法必须被重写,
equals通过Field和哈希值的比较来确定是否是同一个对象..
一般,重写后是new R(-2) == new R(-2) ..
故此,ts.remove(new R(-2))  就是删除之前添加的那个对象...

Field 是成员变量..
作者: 王永彬    时间: 2013-1-20 11:44
标题: RE: 关于集合删除元素的问题!
司懿卓 发表于 2013-1-18 19:40
new R(-2) : 应该是创建了一个 Field 为int 型的对象.
因为,你在添加到集合中时,是 ts.add(new R(-2));这 ...

谢谢你,解释的很透彻,明白了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2