Makala " Java kolleksiýalary barada iň gowy 10 sorag " makalasynyň terjimesidir . Aşakda Java-daky kolleksiýalar barada iň meşhur soraglar, Stackowerflow-da soraldy we ara alnyp maslahatlaşyldy. Bu soraglara seretmezden ozal synpyň iýerarhiýa diagrammasyna seretseňiz gowy bolardy.
1. “ArrayList” -iň ýerine “LinkedList” haçan ulanmaly?
“ArrayList” aslynda bir massiw, onuň elementlerine göni indeks arkaly girip bolýar. Eger massiw dolsa, has köp ýer bolan täzesi zerur bolýar. Elementshli elementleri ýerleşdirmek we herekete getirmek O (n) wagt alar. Mundan başga-da, elementdäki elementleri goşmak we aýyrmak zerur. Bu, “ArrayList” -i ulanmagyň iň uly oňaýsyzlygydyr. “LinkedList” element baglanyşyklarynyň goşa sanawy. Şeýlelik bilen, merkezdäki elemente girmek üçin sahypanyň başyndan ahyryna çenli gözlemeli. Başga bir tarapdan, “LinkedList” -e bir element goşmak we aýyrmak has çalt, sebäbi bu amallar diňe sanawyň özüni üýtgedýär. Iň erbet döwürler aşakda deňeşdirilýär:
Usul |
Arraylist |
Baglanyşyk sanawy |
al (indeks) |
O (1) |
O (n) |
goş (E) |
O (n) |
O (1) |
goş (E, indeks) |
O (n) |
O (n) |
aýyrmak (indeks) |
O (n) |
O (n) |
Iterator.remove () |
O (n) |
O (1) |
Iterator.add (E) |
O (n) |
O (1) |
Işleýän wagtyna garamazdan, uly sanawlar üçin ýadyň ulanylyşy aýratynlykda göz öňünde tutulmalydyr. “LinkedList” -de her düwüniň öňki we indiki düwünleri baglanyşdyrmak üçin azyndan iki goşmaça görkeziji bolmaly, “ArrayList” -de bolsa diňe bir topar element gerek.
ArrayList, LinkedList we Vektor sanawlaryny has deňeşdirmek .
2. Kolleksiýany gaýtalamak döwründe elementleri aýyrmak üçin täsirli ekwiwalent, gaýtalama wagtynda kolleksiýany üýtgetmegiň (elementleri aýyrmagyň) ýeke-täk dogry usuly
Iterator.remove () ulanmakdyr . Mysal üçin: Iň ýaýran ýalňyşlyk: aboveokardaky kody işledeniňizde
“ConcurrentModificationException” alarsyňyz . Bu, iteratoryň tutuş sanawdan geçmek üçin döredilendigi sebäpli bolup geçýär, ýöne şol bir wagtyň özünde sahypa Iterator.remove () jaň edip üýtgedilýär. Bu kadadan çykma üçin resminamalarda ýazylyşy ýaly,
Iterator
itr = list.iterator(); while(itr.hasNext()) { // do something itr.remove(); }
for(Integer i: list) { list.remove(i); }
"Bir sapagyň kolleksiýany üýtgetmegi, umuman başga bir sapagyň üstünde gaýtalanmagy gadagan".
Umuman aýdanyňda, bir sapagyň kolleksiýany üýtgetmegi kabul ederliksiz, başga bir sapak geçip barýarka.
3. Sanawy int [] massiwine nädip öwürmeli?
Muny etmegiň iň aňsat usuly, Apache Commons Lang kitaphanasynda ýerleşýän
ArrayUtils-i ulanmakdyr . JDK-da bu aňlatma üçin gysga ýol ýok. List.toArray () ulanyp bilmejekdigiňizi ýadyňyzdan çykarmaň, sebäbi bu aňlatma sanawy Integer [] görnüşine öwürýär (bu başlangyç görnüş
däl ). Dogry ýol aşakdaky wariant bolar:
4. Int [] massiwini Sanawa nädip öwürmeli?
Iň aňsat usuly, ýokardaky ýaly Apache Commons Lang kitaphanasynda
ArrayUtils-i ulanmakdyr . Şeýle hem, JDK-da bu aňlatma üçin gysga ýol ýok.
5. Kolleksiýany süzmegiň iň gowy usuly haýsy? Işlemegi ýokarlandyrmak üçin
Guava ýa-da
Apache Commons Lang ýaly üçünji tarap paketlerini ulanyp bilersiňiz . Bu paketleriň ikisinde-de süzgüç () usuly bar ( Guava-dan
Collections2 synpynda we Apache-den
CollectionUtils ). Süzgüç () usuly berlen Predikata gabat gelýän elementleri yzyna getirer. JDK-da hemme zat has çylşyrymly. Gowy habar, predikatlar Java 8-de goşular
, ýöne häzirlikçe Iterator-dan tutuş kolleksiýany gaýtalamak üçin ulanmaly. Elbetde, täze “Predicate” interfeýsi bilen tanyşmak arkaly Guava we Apache-den barýan ýoly görelde alyp bilersiňiz. Indi kolleksiýany süzmek üçin aşakdaky kody ulanyp bileris:
6. Sanawy nädip Set-e öwürmeli? Deňligi nädip kesgitlemek isleýändigiňize baglylykda muny etmegiň iki usuly bar. Kodyň birinji bölegi sanawy HashSet-e salýar. Bu ýagdaýda dublikat esasan hashCode () bilen kesgitlenýär. Adatça bu işlär. Comparöne deňeşdirme ýoluny göz öňünde tutmaly bolsaňyz, koduň ikinji bölegini ulanyp, öz deňeşdirijiňizi kesgitläp bilersiňiz.
7. ArrayList-den dublikat elementleri nädip aýyryp bilerin? Bu sorag ýokardaky sorag bilen birneme baglanyşykly. “ArrayList” -däki elementleriň tertibi size ähmiýet bermese, dublikatlary aýyrmak üçin sahypany Setde ýerleşdirip, soňra bolsa Sanawa gaýtarmak bolar. Aşakda mysal getiriň. Elementleriň tertibi siziň üçin möhüm bolsa, sanawy adaty JDK-daky
LinkedHashSet- e ýerleşdirip, tertip üpjün edilip bilner.
8. Toplanan ýygyndy
int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
int[] array = new int[list.size()]; for(int i=0; i < list.size(); i++) { array[i] = list.get(i); }
List list = Arrays.asList(ArrayUtils.toObject(array));
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);
Java-da tertipleşdirilen kolleksiýany goldamagyň birnäçe usuly bar. Bularyň hemmesi tebigy tertipde ýa-da belli bir deňeşdiriji tarapyndan ýygyndy üpjün edýär. Tebigy tertipde elementdäki
Deňeşdirme interfeýsini hem durmuşa geçirmeli.
- Collection.sort () sanawy tertipläp biler. Java resminamalarynda aýdylyşy ýaly, bu görnüş durnukly we n log (n) öndürijiligini kepillendirýär.
- “PriorityQueue” tertipli nobaty üpjün edýär. “PriorityQueue” we “Collections.sort” () arasyndaky tapawut, “PriorityQueue” nobatyň tertibini hemişe saklaýar, ýöne nobatyň diňe birinji elementini alyp bilersiňiz. PriorityQueue.get (4) ýaly elemente tötänleýin girip bilmersiňiz.
- Theygyndyda dublikatlar ýok bolsa, TreeSet-i saýlap bilersiňiz . “PriorityQueue” ýaly, TreeSet hem hemişe sargyt edilen toplumy saklaýar. “TreeSet” -den iň kiçi ýa-da iň uly elementi alyp bilersiňiz, emma elementlere tötänleýin girip bilmersiňiz.
Plyönekeý söz bilen aýdylanda, Collections.sort () bir gezeklik sargyt edilen sanawy üpjün edýär. “PriorityQueue” we “TreeSet” elementlere indekslenen elýeterliligiň bolmazlygy sebäpli elmydama sargyt edilen kolleksiýany saklaýar.
9. Kolleksiýalar.emptyList () ýa-da täze mysal Şol bir sorag boşMap () we boşSet () degişlidir. Iki usul hem boş sanawy yzyna gaýtaryp berýär, ýöne Collections.emptyList () üýtgewsiz sanaw. Bu "boş" sanawa täze elementleri goşup
bilmejekdigiňizi aňladýar . Yzky fonda, Collections.emptyList () usulyna edilen her bir jaň aslynda boş sanawyň täze mysalyny döretmeýär. Munuň ýerine, eýýäm bar bolan boş mysaly gaýtadan ulanar.
Singleton bilen dizaýn nagşy hökmünde tanyş bolsaňyz , nämäni aňladýandygyna düşünmeli. Frequygy-ýygydan çagyrylsa, bu size
has gowy öndürijilik bermeli .
10 Kolleksiýany göçürmek, Collections.copy () Çeşme sanawyny maksat sanawyna göçürmegiň iki usuly bar. Bir usuly, “ArrayList” konstruktoryny ulanmak.
Başga bir usul , “Collections.copy”) usulyny ulanmakdyr . Birinji setirde bellik: iň azyndan asyl sanawyň uzynlygy bilen deň bolan sanawy bölýäris, sebäbi kolleksiýalar baradaky Java resminamalarynda şeýle diýilýär:
ArrayList
dstList = new ArrayList
(srcList);
Barjak ýeriň sanawy iň bolmanda çeşme sanawy ýaly bolmaly.
Diýmek, jemleýji sanaw asyl sanawdan gysga bolmaly däldir. Iki usul hem çuňňur göçürmekdir. Onda bu iki usulyň arasynda näme tapawut bar? Ilki bilen, dstList-de srcList-den ähli elementleri saklamaga ýeterlik ýer bolmasa-da, Collections.copy () dstList-iň ýygnamak kuwwatyny paýlamaz.
Munuň ýerine IndexOutOfBoundsException atar . Munuň peýdasy barmy diýip sorap biler. Munuň sebäbi, bu usulyň wagtynda çyzykly işlemegini üpjün edýär. Bu, “ArrayList” konstruktorynda ýady täzeden paýlamak däl-de, massiwleri gaýtadan ulanmak isleseňiz amatlydyr.
Netijäniň ýerine Makalany okanyňyzdan soň soraglaryňyz bar bolsa, teswirlerde sorap bilersiňiz. Şeýle hem, terjimede nädogry bir zat tapsaňyz ýa-da başga bir ýalňyşlyk tapsaňyz, premýer-ministriňize ýazyň, düzediler we size minnetdarlyk bildiriler.
Asyl.
ArrayList
dstList = new ArrayList
(srcList.size()); Collections.copy(dstList, srcList);
GO TO FULL VERSION