contains源代碼如下:
這里的O代表contains方法中的參數對象,如果數值大於等於0,就會返回true。
O調用什么樣的equals方法取決於O是什么類型
contains方法中的參數類型如果是String類型,則調用String對象中的equals方法;
contains方法中的參數類型如果是基本數據類型的包裝類,則調用包裝類中的equals方法;
contains方法中的參數類型如果是類部類型,則調用類部類型中的equals方法;
String類型:
這時的結果輸出為true。
1:當執行到list.contains("李坦克")時,調用了contains方法,其中張大炮賦值給了O,O即為String類
2:接着在調用indexOf方法,因為O !=null,所以進入else{ }語句中,O去調用String類的equals方法,先比較地址,在比較每一個字符,有一樣相同即返回true,與集合中的元素進行比較,一旦找到相同的,則返回此時對應的i。
3:這時跳轉回contains方法中,因為此時i>=0,所以返回true。
4:如果O為null,就會執行if語句,接着通過for循環去判斷集合中是否有值為null的元素,若有則返回i,即返回true;如果遍歷完集合沒有找到null這個元素,則會跳出if語句,執行最后一條語句:return -1;,所以最后會返回false。
自定義類型:
未重寫equals方法:
這里首先定義一個學生類,這里返回的是false。
1:執行到list.contains(new Student("20"))時,跳轉contains方法,創建一個Student對象20賦值給O,所以O為Student類。
2:接着就是跳轉到indexOf方法中,因為O !=null,進入else語句中,O本來是要調用Student中的equals方法的,但是Student類中沒有重寫equals方法,所以就要去調用Student父類Object類中的equals方法,而Object中的equals方法是比較地址,當我們每創建一個對象,都會new一個新的空間,也就是每一個對象都會有一個新地址,所以O的地址與集合中的每個元素地址都不一樣,所有最終會返回false
3:假如O=null跟String類型一樣。
重寫equal方法:
重寫的equals方法中,obj就是集合中每個元素,判斷傳進來的類型是否為Student類創建出來的對象或者是Student的子類,如果是就執行語句,不是返回false;如果是的話,將obj下轉為Student類型,這里this.id是指誰調用equals方法就是誰的id,這里t.id是指傳進來的obj下轉型t的id。
為什么這里重寫equals方法后返回的就是true了。
1:當代碼執行到list.contains(new Student("20"))時,跳轉contains方法,創建一個新的對象20賦值給O,這時O就是Student類
2:在調用indexOf方法,因為O !=0,所以直接進入else語句中,因為這里我們在Student類中重寫了equals方法,所以O去調用Student類中重寫后的equals方法,我們定義的equals方法也是先比較地址,在比較字符,所以會返回true,即條件滿足進入if語句,執行return i;
3:跳轉回contains方法中,此時i>=0;所以最終會返回true。
4:如果這里O還是為null跟String類型一樣