LinkedList,在这段代码中,为什么用remove删不掉Name的对象呀

jolianasd 2008-03-13 09:56:06
package com.oristand.program;
public class Name {
String fristName, lastName;
public Name() {
}
public Name(String string, String string2) {
fristName = string;
lastName = string2;
}
public String toString() {
return (fristName + " " + lastName);
}
public int hashCode() {
return 31*fristName.hashCode()+lastName.hashCode();
}
public boolean equals(Object obj) {
Name name = new Name();
if (obj instanceof Name) {
return (fristName.equals(name.fristName))
&& (lastName.equals(name.lastName));
}
return obj.equals(name);
}
}
////////////////////////////////////////////////////////////////////////
package com.oristand.program;
import java.util.*;
public class TestHashSet {
public static void main(String[] args) {
Collection<Object> c = new LinkedList<Object>();
c.add("hello");
c.add(100);
c.add(new Name("f1", "l1"));
c.add(new Integer(100));
System.out.println(c);
c.remove("hello");
c.remove(new Integer(100));
c.remove(new Name("f1", "l1"));//为什么这里会删不掉
System.out.println();
System.out.println(c);
}
}
...全文
295 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbeacon 2008-03-14
  • 打赏
  • 举报
回复
LinkList 删除元素时,将依次对比输入值与其自身元素,当相同时,删除此元素.部分源代码如下:
public boolean remove(Object o) {
......
if (o.equals(e.element)) {
remove(e);
return true;
}
......
用到了输入对象中的equals方法来比较对象.

看一下LZ的此代码片段:
public boolean equals(Object obj) {
Name name = new Name();
if (obj instanceof Name) {
return (fristName.equals(name.fristName))
&& (lastName.equals(name.lastName));

}
return obj.equals(name);
}
name 为新实例(见绿色部分)在new时调用其无参构造函数,并没有给fristName赋值.name.fristName 为null,
其中红色部分中fristName 为 "l1" 此return永远返回false.
所以使用c.remove(new Name("f1", "l1"));不会删除其c中的元素.
GODProbe 2008-03-14
  • 打赏
  • 举报
回复
重写Name的equals()方法。
fx8023jo 2008-03-14
  • 打赏
  • 举报
回复
new Name();每次都创建一个新的实例,并且每次是不同的。你想删除的那个Name实例只与你加入ArrayList()时的那个相同。而你删除时给定的Name实例则是另一个实例了。所以删除不了。
love1907 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 love1907 的回复:]
引用 2 楼 J_Factory 的回复:
package co.com.onNet;

public class Name {
String fristName, lastName;
public Name() {
}
public Name(String string, String string2) {
fristName = string;
lastName = string2;
}
public String toString() {
return (fristName + " " + lastName);
}
public int hashCode() {
return 31*fristName.hashCode()+lastName.hashCo…

确实可以转
[/Quote]
love1907 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 J_Factory 的回复:]
package co.com.onNet;

public class Name {
String fristName, lastName;
public Name() {
}
public Name(String string, String string2) {
fristName = string;
lastName = string2;
}
public String toString() {
return (fristName + " " + lastName);
}
public int hashCode() {
return 31*fristName.hashCode()+lastName.hashCode();
}
public boolean equals(Ob…
[/Quote]

好象你那样的强转是否不行吧obj强转到自定义类是否不对,
J_Factory 2008-03-13
  • 打赏
  • 举报
回复
package co.com.onNet;

public class Name {
String fristName, lastName;
public Name() {
}
public Name(String string, String string2) {
fristName = string;
lastName = string2;
}
public String toString() {
return (fristName + " " + lastName);
}
public int hashCode() {
return 31*fristName.hashCode()+lastName.hashCode();
}
public boolean equals(Object obj) {
Name name;
if (obj instanceof Name) {
name=(Name)obj;
//obj的类型要转换成Name,在你的代码里name没有内容
return (fristName.equals(name.fristName))
&& (lastName.equals(name.lastName));
}
//return obj.equals(name);
return false;
}
}
临远 2008-03-13
  • 打赏
  • 举报
回复
因为不是一个对象呗。

要不你让Name实现equals()和hashCode()试试。

用一个什么规则判断相等

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧