问题描述
- (c.remove(new Name("f1","l1")));为什么没被移除
-
import java.util.*;public class BasicContainer {
public static void main(String[] args) {
Collection c = new HashSet();
c.add("hello");
c.add(new Name("f1","l1"));
c.add(new Integer(100));
c.remove("hello");
c.remove(new Integer(100));
System.out.println
(c.remove(new Name("f1","l1")));
System.out.println(c);
}}
class Name implements Comparable {
private String firstName,lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName; this.lastName = lastName;
}
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public String toString() { return firstName + " " + lastName; }public boolean equals(Object obj) { if (obj instanceof Name) { Name name = (Name) obj; return (firstName.equals(name.firstName)) && (lastName.equals(name.lastName)); } return super.equals(obj); } public int hashCode() { return firstName.hashCode(); } public int compareTo(Object o) { Name n = (Name)o; int lastCmp = lastName.compareTo(n.lastName); return (lastCmp!=0 ? lastCmp : firstName.compareTo(n.firstName)); }
}
解决方案
remove是new出来的对象,hashmap是通过hashcode区分是不是同一个对象的。
两个对象的hashcode不一样,除非你重写一下name类的hashcode获取方式。
解决方案二:
你这样操作会不会报要删除的元素不存在?
解决方案三:
- 重写hashCode, equal方法
- 不能直接删除,采用iterator迭代删除