JavaRush /Blog Jawa /Random-JV /Top 10 Pitakonan babagan Koleksi ing Jawa
FedoraLinux
tingkat
Москва

Top 10 Pitakonan babagan Koleksi ing Jawa

Diterbitake ing grup
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.
  1. Collections.sort () bisa ngurutake List. Kaya sing kasebut ing dokumentasi Jawa, jinis iki stabil lan njamin kinerja n log (n).
  2. 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).
  3. 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);
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION