問題引子:ide
ist students=newArrayList();this
students.add(newStudent("20160800612"));cdn
System.out.println(students.contains(newStudent("20160800612")))對象
返回FALSEblog
Student stu=newStudent("123");students.add(stu);System.out.println(students.contains(stu));接口
返回TRUE內存
對於以上代碼,相信不少人有問題,這種不能靠主管想象力的,,,,咱們仍是來看後臺代碼靠譜ci
按住ctrl鍵點擊contains進入List.class是一個接口,其中有的一個抽象方法 boolean contains(Object o);element
他實際上調用的contains方法是ArrayList類中從新的contains方法get
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裏內容相同的元素內存地址的方法