今天給學生講解
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;
}
}
}
測試了一下,通過。(
北大青鳥武漢魯廣校區 王老師指導)