对于集合List Set Map当调用其方法contains,是不是包含某元素时,会自动调用对象的equals方法,对于ArrayList只需要覆盖对象的equals即可,但对于Set Map,还需要覆盖对象的hashCode,不然得不到预期的结果
测试代码:
public class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public boolean equals(Object obj) {
Name name = (Name)obj;
System.out.println(name.firstName.equals(firstName)&&name.lastName.equals(lastName));
return name.firstName.equals(firstName)&&name.lastName.equals(lastName);
}
@Override
public int hashCode() {
return firstName.hashCode()*lastName.hashCode();
}
}
public class TestContains {
static void testHashSet(){
Set s = new HashSet();
Name name = new Name("hello","world");
s.add(name);
System.out.println(s.contains(new Name("hello","world")));
//System.out.println(s.contains(name));
}
static void testHashMap(){
Map map = new HashMap();
Name name = new Name("hello","world");
map.put(name, name);
System.out.println(map.containsKey( new Name("hello","world")));
}
static void testArrayList(){
List list = new ArrayList();
Name name = new Name("hello","world");
list.add(name);
System.out.println(list.contains(new Name("hello","world")));
}
/**
* @param args
*/
public static void main(String[] args) {
testArrayList();
testHashSet();
testHashMap();
}
}