package Feb2017;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Ques0220 {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student("001"));
Map<Student, Object> map = new HashMap<Student, Object>();
map.put(new Student("001"), new Object());
System.out.println("list是否包含001:" + list.contains(new Student("001")));
System.out.println("map是否包含001:" + map.containsKey(new Student("001")));
}
}
class Student {
private String stuId;
public Student(String stuId) { this.stuId = stuId; }
public String getStuId() { return stuId; }
public void setStuId(String stuId) { this.stuId = stuId; }
@Override
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student stu = (Student) obj;
if (stu.getStuId() == null || stuId == null) return false;
return stuId.equalsIgnoreCase(stu.getStuId());
}
return false;
}
// 注意:未重寫 hashCode()
}
Student 重寫了 equals() 但未重寫 hashCode()。這會導致:
equals(),返回 true。hashCode(),默認基於對象地址,新創建的 Student("001") 與 map 中的 key hashCode 不同,直接返回 false,不會調用 equals()。list是否包含001:true
map是否包含001:false
重寫 equals() 時必須重寫 hashCode(),否則在基於哈希的集合(HashMap、HashSet 等)中會出現邏輯錯誤。
正確做法:
@Override
public int hashCode() {
return stuId == null ? 0 : stuId.toLowerCase().hashCode();
}