Dengan asumsi yang arraylist
didefinisikan sebagai ArrayList<String> arraylist
, arraylist.removeAll(arraylist)
setara dengan arraylist.clear()
?
Jika demikian, dapatkah saya berasumsi bahwa clear()
metode ini lebih efisien untuk mengosongkan daftar array?
Apakah ada peringatan dalam menggunakan arraylist.removeAll(arraylist)
bukan arraylist.clear()
?
arraylist.removeAll(arraylist)
? Saya sama sekali tidak melihat alasan untuk melakukan itu.elementData[i] = null
dane.remove()
signifikan?arrList.removeAll(arrList)
bukanarrList.clear()
.arrList1.removeAll(arrList2)
adalah masalah yang berbeda.if (c == this && !isEmpty()) { clear(); return true; }
. Saya harus mengirimkan ini ke OpenJDK sebagai tambalan! ;-)Jawaban:
Kode sumber untuk
clear()
:Kode sumber untuk
removeAll()
(Sebagaimana didefinisikan dalamAbstractCollection
):clear()
jauh lebih cepat karena tidak harus berurusan dengan semua pemanggilan metode tambahan.Dan seperti yang ditunjukkan Atrey,
c.contains(..)
meningkatkan kompleksitas wakturemoveAll
ke O (n 2 ) sebagai lawanclear
dari O (n).sumber
c.contains(...)
mengkuadratkan kompleksitas waktu operasi akan membuat jawaban ini lengkap.AbstractList.Itr.remove()
danArrayList.remove(int)
), jugasize = 0; elementData = new Object[10];
semua sisanya akan menjadi sampah yang dikumpulkan, karena array backing tidak memiliki referensi luar.Kompleksitas waktu
ArrayList.clear()
isO(n)
dan ofremoveAll
isO(n^2)
.Jadi ya,
ArrayList.clear
jauh lebih cepat.sumber
The
clear()
Metode menghapus semua elemen tunggalArrayList
. Ini operasi cepat, karena hanya mengatur elemen arraynull
.The
removeAll(Collection)
metode, yang merupakan warisan dariAbstractCollection
, menghapus semua elemen yang ada di koleksi argumen dari koleksi Anda memanggil metode pada. Ini operasi yang relatif lambat, karena harus mencari melalui salah satu koleksi yang terlibat.sumber
Kecuali ada optimasi khusus yang memeriksa apakah argumen yang diteruskan
removeAll()
adalah koleksi itu sendiri (dan saya sangat ragu bahwa optimasi seperti itu ada di sana) itu akan secara signifikan lebih lambat daripada yang sederhana.clear()
.Terlepas dari itu (dan setidaknya sama pentingnya):
arraylist.removeAll(arraylist)
hanya membingungkan, kode membingungkan. Ini adalah cara yang sangat terbelakang untuk mengatakan "hapus koleksi ini". Keuntungan apa yang dimilikinya dibanding yang sangat dimengertiarraylist.clear()
?sumber
Mereka melayani tujuan yang berbeda.
clear()
membersihkan instance kelas,removeAll()
menghapus semua objek yang diberikan dan mengembalikan status operasi.sumber
clear()
akan melalui Array yang mendasarinya dan mengatur setiap entri menjadi nol;removeAll(collection)
akan melalui ArrayList memeriksa koleksi danremove(Object)
jika ada.Saya akan membayangkan itu
clear()
jauh lebih cepat daripada menghapus semua karena itu tidak membandingkan, dll.sumber
Hapus lebih cepat karena tidak mengulang elemen untuk dihapus. Metode ini dapat mengasumsikan bahwa SEMUA elemen dapat dihapus.
Remove all
tidak berarti menghapus semua elemen dalam daftar, hanya yang disediakan sebagai parameter HARUS dihapus. Oleh karena itu, lebih banyak upaya diperlukan untuk menjaga yang tidak boleh dihapus.KLARIFIKASI
Dengan 'loop', maksud saya itu tidak harus memeriksa apakah elemen tersebut harus disimpan atau tidak. Itu dapat mengatur referensi
null
tanpa mencari melalui daftar elemen yang disediakan untuk dihapus.Clear
IS lebih cepat darideleteall
.sumber
ArrayList.clear()
memiliki loop juga.target.removeAll(param)
akan beralih lagiparam
dan kemudian panggilantarget.contains(...)
yang beralih berakhirtarget
.clear () akan jauh lebih efisien. Itu hanya akan menghapus setiap item. Menggunakan removeAll (arraylist) akan membutuhkan lebih banyak pekerjaan karena akan memeriksa setiap item dalam arraylist untuk melihat apakah ada dalam arraylist sebelum menghapusnya.
sumber
Array => setelah ruang dialokasikan untuk variabel Array pada waktu berjalan, ruang yang dialokasikan tidak dapat diperpanjang atau dihapus.
ArrayList => Ini bukan kasus di arraylist. ArrayList dapat tumbuh dan menyusut pada saat dijalankan. Ruang yang dialokasikan dapat diminimalkan atau dimaksimalkan pada saat dijalankan.
sumber