由於arraylist集合底層儲存結構是陣列,所以arraylist中的remove刪除方法,其實就是陣列的刪除,大家或許對於陣列的刪除都不陌生,先遍歷比較判斷是否存在,存在便刪除。
原始碼如下:
public boolean remove(object o)
} else
}return false;
}通過上面我們可以看到在遍歷中比較使用的是equals方法,看到這裡,有的人應該已經明白了,我所說的陷阱是什麼了。
object類是所有類的超類,object類中存在equals方法,但是,其比較的是物件位址。
說道這裡有的人又有疑問了,因為大家或許看到過關於string類物件的比較「==」和equals的區別,那裡明明說的是「==」比較的是物件位址,而equals方法比較的是物件實際儲存的值,object類是所有類的超類,那麼他當然也是string類的超類了。
所以string類呼叫object當然equals方法的話,那不也是比較的是物件位址了,但是實際上string類呼叫equals方法比較的卻是物件實際儲存的值,是因為,string類的底層重寫了object的equals方法,這樣stringl類掉用的便是重寫後的equals的方法,那樣比較的自然不是物件位址了。
我們可以看下string類的equals原始碼部分:
public boolean equals(object anobject)
if (anobject instanceof string)
return true;}}
return false;
}說道這裡,有得朋友應該就明白了,在remove方法中比較所用的equals方法是object中的equals方法,比較的是物件位址,那樣便會造成當我們給remove方法傳引數的時候,如果傳入一new乙個和集合中物件值相同的物件,那麼便無法從集合刪除,因為new的物件雖然物件值相同,但是位址不同,而object類的equals方法比價的正是位址。
例如:public static void main(string args)
}輸出:
2student [name=張三, age=10]
student [name=李四, age=10]
通過輸出我們可以看到集合中的物件並沒有被刪除。
那麼我們該怎麼解決這個問題那,我們可以參考上string類的做法在物件類中重寫equals方法便好了
例如@override
public boolean equals(object obj)
if(obj instanceof student)
}return false;
}上面便是我在student類中重寫的equals方法,這樣remove中比較呼叫的便是我重寫過的equals方法,比較是物件值了。
這樣我們再去remove便可以刪除了。
重寫後public static void main(string args)
}輸出:
2student [name=李四, age=10]
Python列表淨化時for與remove的使用
目標 去除列表中的奇數元素 以列表 4,5,5,4 為例,第一次寫出的 如下 def purify lst for i in lst if i 2 0 lst.remove i return lst lst 4,5,5,4 print purify lst 得到的輸出為 4,5,4 為何元素5沒有被...
List的IndexOf方法和Remove方法
microsoft位址 list的indexof 方法 如果t是值型別的,就按照比較值的方法從列表的第乙個元素開始逐個匹配,如果t是引用型別,就比較引用是否相同 舉例如下 classa listlista newlist lista.add newa 3 lista.add newa 4 lista...
List的IndexOf方法和Remove方法
list的indexof 方法 如果t是值型別的,就按照比較值的方法從列表的第乙個元素開始逐個匹配,如果t是引用型別,就比較引用是否相同 舉例如下 class a listlista new list lista.add new a 3 lista.add new a 4 lista.add new...