問題引子:
ist students=newArrayList();
students.add(newStudent("20160800612"));
System.out.println(students.contains(newStudent("20160800612")))
返回FALSE
Student stu=newStudent("123");students.add(stu);System.out.println(students.contains(stu));
返回TRUE
對於以上程式碼,相信很多人有問題,這種不能靠主管想象力的,,,,我們還是來看後臺程式碼靠譜
按住ctrl鍵點選contains進入List.class是一個介面,其中有的一個抽象方法 boolean contains(Object o);
他實際上呼叫的contains方法是ArrayList類中重新的contains方法
publicboolean contains(Object o) {returnindexOf(o) >= 0;
}
按住ctrl鍵點選indexOf進入ArrayList類中indexOf方法
publicint indexOf(Object o) {if(o ==null) {for(inti = 0; i < size; i++)if(elementData[i]==null)return i;
} else {for(inti = 0; i < size; i++)if (o.equals(elementData[i]))return i;
}return-1;
}
我們看到Object o會呼叫equals方法,但是Student中並沒有重新equals方法,所以最後呼叫的事Object 中的equals方法
publicboolean equals(Object obj) {return(this== obj);
}
很明顯,this==obj比較的事地址,所以兩個new的物件地址肯定不是一樣的,所以返回false
懂了吧~~~~~~~~~~~~~
所以還是多分析分析後臺程式碼,更加清楚明白啦
怎麼解決這個問題呢,就是在Student類中重寫這個 equals方法,比較的時候去比較id 但是注意重寫時引數是Object 我們需要下轉型,這個時候要判斷Object是否為Student
@Overridepublicboolean equals(Object obj) {if(objinstanceof Student) return((Student)obj).id.equals(this.id);returnfalse;
}
比較兩個List裡內容相同的元素記憶體地址的方法