java——ArrayList中contains()方法中的疑問

問題引子: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裏內容相同的元素內存地址的方法

相關文章
相關標籤/搜索