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

Musk_Coder發表於2019-02-28

問題引子:

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裡內容相同的元素記憶體地址的方法

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

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

相關文章