Artikel kasebut minangka terjemahan saka artikel
" 10 pitakonan paling apik babagan Koleksi Jawa " . Ing ngisor iki ana pitakonan sing paling populer babagan koleksi ing Jawa, sing ditakoni lan dibahas ing Stackowerflow. Sadurunge sampeyan ndeleng pitakonan kasebut, luwih becik ndeleng diagram hierarki kelas.
1. Nalika nggunakake LinkedList tinimbang ArrayList?
ArrayList sejatine minangka array; unsur-unsur kasebut bisa diakses langsung kanthi indeks. Yen larik overflows, sing anyar karo papan liyane dadi perlu. Nempatake lan mindhah kabeh unsur bakal njupuk wektu O (n). Uga, nambah lan mbusak unsur perlu kanggo mindhah unsur ana ing array. Iki mbok menawa ora nyaman paling gedhe nggunakake ArrayList. LinkedList minangka dhaptar ganda pranala unsur. Mangkono, kanggo ngakses unsur ing tengah, sampeyan kudu nelusuri saka awal banget kanggo mburi sheet. Ing sisih liya, nambah lan mbusak unsur ing LinkedList luwih cepet amarga operasi kasebut mung ngganti dhaptar kasebut dhewe. Wektu paling awon dibandhingake ing ngisor iki:
Metode |
Arraylist |
LinkedList |
entuk (indeks) |
O(1) |
O(n) |
tambah (E) |
O(n) |
O(1) |
tambah (E, indeks) |
O(n) |
O(n) |
mbusak (indeks) |
O(n) |
O(n) |
Iterator.remove() |
O(n) |
O(1) |
Iterator.add(E) |
O(n) |
O(1) |
Senadyan wektu mlaku, panggunaan memori kudu dianggep individu kanggo dhaptar gedhe. Ing LinkedList, saben simpul kudu duwe paling ora rong penunjuk tambahan kanggo nyambungake simpul sadurunge lan sabanjure, nalika ing ArrayList, mung sawetara unsur sing dibutuhake.
Perbandhingan liyane dhaptar ArrayList, LinkedList lan Vektor .
2. Efisien padha karo njabut unsur sak pengulangan koleksi Cara mung bener kanggo ngowahi (mbusak unsur) koleksi sak pengulangan nggunakake
Iterator.remove () . Contone: Kesalahan sing paling umum yaiku: Sampeyan bakal entuk
ConcurrentModificationException nalika mbukak kode ing ndhuwur. Mengkono amarga iterator kui kanggo pindhah liwat kabeh dhaftar, nanging ing wektu sing padha sheet diganti dening nelpon Iterator.remove (). Kaya sing ditulis ing dokumentasi kanggo pangecualian iki,
Iterator
itr = list.iterator(); while(itr.hasNext()) { // do something itr.remove(); }
for(Integer i: list) { list.remove(i); }
"Ora umume diidini siji utas kanggo ngowahi koleksi nalika utas liyane lagi diulang."
Umumé, siji utas ora ditrima kanggo ngowahi koleksi nalika utas liyane ngliwati.
3. Carane Ngonversi List kanggo int [] array? Cara paling gampang kanggo nindakake iki yaiku nggunakake
ArrayUtils , dumunung ing perpustakaan
Apache Commons Lang .
int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
Ora ana trabasan kanggo ekspresi iki ing JDK. Elinga yen sampeyan ora bisa nggunakake List.toArray () amarga ekspresi iki ngowahi Daftar dadi Integer [] (sing
dudu jinis primitif). Cara sing bener bakal dadi pilihan ing ngisor iki:
int[] array = new int[list.size()]; for(int i=0; i < list.size(); i++) { array[i] = list.get(i); }
4. Carane ngowahi array int [] menyang Dhaptar? Cara paling gampang uga nggunakake
ArrayUtils ing perpustakaan
Apache Commons Lang , kaya ing ndhuwur.
List list = Arrays.asList(ArrayUtils.toObject(array));
Uga, ora ana trabasan kanggo ekspresi iki ing JDK.
5. Apa cara paling apik kanggo nyaring koleksi kasebut? Sampeyan bisa nggunakake paket pihak katelu kayata
Guava utawa
Apache Commons Lang kanggo nambah fungsi. Loro-lorone paket kasebut duwe metode filter () (ing kelas
Collections2 saka Guava lan
CollectionUtils saka Apache). Metode filter () bakal ngasilake unsur sing cocog karo Predikat sing diwenehake. Ing JDK kabeh luwih rumit. Kabar apik yaiku predikat bakal ditambahake ing Jawa 8
, nanging saiki sampeyan kudu nggunakake Iterator kanggo ngulang kabeh koleksi. Mesthi, sampeyan bisa niru path sing diikuti Jambu lan Apache kanthi kenal karo antarmuka Predikat anyar. Saiki kita bisa nggunakake kode ing ngisor iki kanggo nyaring koleksi:
6. Carane gampang Ngonversi List kanggo Set? Ana rong cara kanggo nindakake iki, gumantung carane sampeyan pengin nemtokake kesetaraan. Piece pisanan saka kode nempatno dhaftar menyang HashSet. Duplikat ing kasus iki ditemtokake utamané dening hashCode (). Biasane iki bakal bisa. Nanging yen sampeyan kudu njupuk menyang akun path comparison, iku bakal luwih apik kanggo nggunakake bagean liya saka kode, ngendi sampeyan bisa nemtokake comparator dhewe.
7. Carane mbusak unsur duplikat saka ArrayList? Pitakonan iki ana gegayutane karo pitakonan ing ndhuwur. Yen urutan unsur ing ArrayList ora Matter kanggo sampeyan, pamindhahan pinter bakal nyelehake sheet ing Set kanggo mbusak duplikat, banjur bali menyang Dhaftar. Ing ngisor iki contone. Yen urutan unsur penting kanggo sampeyan, banjur pesenan bisa dipesthekake kanthi nyelehake dhaptar ing
LinkedHashSet , sing ana ing JDK standar.
8. Koleksi diurutake
int[] array = {1,2,3,4,5}; List
list = new ArrayList
(); for(int i: array) { list.add(i); }
Iterator
itr = list.iterator(); while(itr.hasNext()) { int i = itr.next(); if (i > 5) { // filter all ints bigger than 5 itr.remove(); } }
public interface Predicate
{ boolean test(T o); } public static
void filter(Collection
collection, Predicate
predicate) { if ((collection != null) && (predicate != null)) { Iterator
itr = collection.iterator(); while(itr.hasNext()) { T obj = itr.next(); if (!predicate.test(obj)) { itr.remove(); } } } }
filter(list, new Predicate
() { public boolean test(Integer i) { return i <= 5; } });
Set
set = new HashSet
(list);
Set
set = new TreeSet
(aComparator); set.addAll(list);
ArrayList** list = ... // initial a list with duplicate elements Set
set = new HashSet
(list); list.clear(); list.addAll(set);
Ana sawetara cara kanggo ndhukung koleksi sing diurutake ing Jawa. Kabeh mau nyedhiyakake koleksi kanthi urutan alami utawa kanthi komparator sing ditemtokake. Ing kasus urutan alam, sampeyan uga kudu ngleksanakake antarmuka
Comparable ing unsur.
- Collections.sort () bisa ngurutake List. Kaya sing kasebut ing dokumentasi Jawa, jinis iki stabil lan njamin kinerja n log (n).
- PriorityQueue nyedhiyakake antrian sing tertib. Bentenipun antarane PriorityQueue lan Collections.sort () iku PriorityQueue njaga urutan antrian kabeh wektu, nanging sampeyan mung bisa njaluk unsur pisanan saka antrian. Sampeyan ora bisa kanthi acak ngakses unsur kaya PriorityQueue.get (4).
- Yen ora ana duplikat ing koleksi, sampeyan bisa milih TreeSet . Uga kaya PriorityQueue, TreeSet njaga set dhawuh ing kabeh wektu. Sampeyan bisa njaluk unsur paling cilik utawa paling gedhe saka TreeSet, nanging sampeyan isih ora bisa duwe akses acak kanggo unsur.
Cukup, Collections.sort () menehi dhaptar pesenan siji-wektu. PriorityQueue lan TreeSet njaga koleksi dhawuh ing kabeh wektu, kanthi biaya kekurangan akses sing diindeks menyang unsur.
9. Collections.emptyList () utawa anyar Kayata Pitakonan padha ditrapake kanggo emptyMap () lan emptySet (). Loro-lorone cara ngasilake dhaptar kosong, nanging Collections.emptyList () minangka dhaptar sing ora bisa diganti. Iki tegese sampeyan
ora bisa nambah unsur anyar menyang dhaptar "kosong". Ing latar mburi, saben telpon kanggo cara Collections.emptyList () ora bener nggawe conto anyar saka dhaftar kosong. Nanging, bakal nggunakake maneh conto kosong sing wis ana. Yen sampeyan kenal karo Singleton minangka pola
desain , sampeyan kudu ngerti apa sing dimaksud. Iki kudu menehi kinerja
sing luwih apik yen kerep diarani.
10 Nyalin koleksi, Collections.copy () Ana rong cara kanggo nyalin dhaptar sumber menyang dhaptar tujuan. Salah sawijining cara yaiku nggunakake konstruktor ArrayList. Cara liya yaiku nggunakake metode
Collections.copy () . Wigati baris pisanan: kita nyedhiyakake dhaptar sing paling sethithik dawane dhaptar asli, amarga dokumentasi Jawa babagan koleksi ujar:
ArrayList
dstList = new ArrayList
(srcList);
Dhaptar tujuan kudu paling sethithik minangka dhaptar sumber.
Tegese dhaptar pungkasan kudu ora luwih cendhek tinimbang sing asli. Loro-lorone cara nyalin cethek. Dadi apa bedane antarane rong cara kasebut? First, Collections.copy () ora realokasi kapasitas koleksi dstList, sanajan dstList ora cukup papan kanggo ngemot kabeh unsur saka srcList. Nanging, bakal mbuwang
IndexOutOfBoundsException . Siji bisa takon apa ana keuntungan kanggo iki. Alasane yaiku manawa cara kasebut bisa mlaku kanthi linear ing wektu. Iki uga cocok yen sampeyan pengin nggunakake maneh array tinimbang maneh nyedhiakke memori ing ArrayList konstruktor.
Tinimbang kesimpulan Yen sawise maca artikel sampeyan isih duwe pitakonan, aja ragu-ragu takon ing komentar. Uga, yen sampeyan nemokake ora akurat ing terjemahan utawa kesalahan liyane, banjur nulis menyang PM, bakal didandani, lan sampeyan bakal matur nuwun.
Asli.
ArrayList
dstList = new ArrayList
(srcList.size()); Collections.copy(dstList, srcList);
GO TO FULL VERSION