容器类对象在调用remove contatins 等方法时需要比较对象是否相等,这会涉及到对象类型的equals 方法 和
hashCode 方法;对于自定义的类型需要重写equals 和hashcode 方法以实现自定义对象相等 规则。
相等的对象应该具有相等的hash codes
package com.wsx;
import java.util.*;
public class Test {
public static void main(String[] a){
//Collection c=new ArrayList();
Collection c=new HashSet();
c.add("Hello");
c.add(new Name("f1", "l1"));
c.add(new Integer(100));
c.add("Hello");
c.add(new Integer(100));
c.add(new Name("f1", "l1"));
System.out.println(c.remove(new Name("f1","l1")));//如果对象equals,删除成功会返回true
System.out.println(c.size());
System.out.println(c);
}
}
class Name{
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){//重新equals方法
if(obj instanceof Name){
Name name=(Name) obj;
return (firstName.equals(name.firstName))
&&(lastName.equals(name.lastName));
}
return super.equals(obj);//如果传进来的对象不是name类型的话,交给父类处理
}
public int hashCode(){
return firstName.hashCode();
}*/
}
输出结果
false
4
[100, f1 l1, f1 l1, Hello]
重写equals 方法后,将上面Name类的注释去掉
输出结果为
true
2
[100, Hello]