JavaRush /Java Blog /Random-TK /Java-da ýygyndylar barada iň gowy 10 sorag
FedoraLinux
Dereje
Москва

Java-da ýygyndylar barada iň gowy 10 sorag

Toparda çap edildi
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.
  1. Collection.sort () sanawy tertipläp biler. Java resminamalarynda aýdylyşy ýaly, bu görnüş durnukly we n log (n) öndürijiligini kepillendirýär.
  2. “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.
  3. 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);
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION