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);
}
}

解决方案 »

  1.   

    因为不是一个对象呗。要不你让Name实现equals()和hashCode()试试。用一个什么规则判断相等
      

  2.   

    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;

    }
      

  3.   


    好象你那样的强转是否不行吧obj强转到自定义类是否不对,
      

  4.   

    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中的元素.
      

  5.   

    new Name();每次都创建一个新的实例,并且每次是不同的。你想删除的那个Name实例只与你加入ArrayList()时的那个相同。而你删除时给定的Name实例则是另一个实例了。所以删除不了。