今天给学生讲解
ArrayList集合用法,讲到contains方法的用法时,学生出现一个怪问题,contains方法检查集合是否包含对象时,明明包含该对象,但有时候返回false,有时候返回true。
既然问到这个问题,就要从其源头来找原因,我带领他们查看
contains方法的源代码,如下:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
于是我们找到indexOf方法的源代码,如下:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
发现最终如果对象不为空的情况下是用equals方法来比较对象是否相等的。于是继续找到equals的源代码,如下:
public boolean equals(Object obj) {
return (this == obj);
}
终于发现原因所在,原来Object中的equals方法是用==来比较两个对象的,那么在我们自己写的实体类中必须重写equals方法,最后修改如下:
public class User {
private String name;
private String pass;
public User(String name, String pass) {
super();
this.name = name;
this.pass = pass;
}
public User() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(obj instanceof User){
User u = (User)obj;
if(this.name.equals(u.name)){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
测试了一下,通过。(
北大青鸟武汉鲁广校区 王老师指导)