ArrayList中remove方法的陷阱

2021-09-22 08:11:17 字數 1482 閱讀 1094

由於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...