Top 10 întrebări despre colecțiile în Java
Top 10 întrebări despre colecțiile în Java
1. Când se utilizează LinkedList în loc de ArrayList?
ArrayList, de fapt, este o matrice, elementele sale pot fi accesate direct din index. În caz de depășire a unei matrice este nevoie în noi, având mai mult spațiu. Plasarea si deplasarea tuturor elementelor va lua O (n). De asemenea, necesitatea de a adăuga și șterge elemente pentru a muta elementele existente în matrice. Acesta este probabil cel mai mare dezavantaj în utilizarea ArrayList.
LinkedList - este o listă dublă de link-uri către elemente. Astfel, pentru a avea acces la un element în centru, este necesar să se caute de la începutul până la sfârșitul foii. Pe de altă parte, adăugarea și eliminarea elementului LinkedList mai rapid, deoarece aceste operații modifica numai lista în sine.
Cele mai grave ori sunt comparate mai jos:
În ciuda timpului de funcționare, utilizarea memoriei trebuie gândită în mod individual pentru liste mari. LinkedList fiecare nod trebuie să aibă cel puțin două pointer suplimentare pentru a lega nodurile anterioare și următoare la momentul respectiv ca ArrayList numai elementele de matrice.
Mai multe comparații liste de ArrayList, LinkedList, și Vector (ing.).
2. echivalent eficace pentru a elimina elementele în timp ce iterarea o colecție
Singurul mod corect pentru modificări (deleții) colecții în timpul repetare - este de a utiliza Iterator.remove ().
De exemplu:
Versiunea cea mai comună a erorii:
Ai ConcurrentModificationException în timp ce codul de mai sus. Acest lucru se întâmplă pentru motivul că iteratorul a fost generat pentru deplasarea în întreaga listă, dar în același timp, foaia este schimbată Iterator.remove) apel (.
Dupa cum am scris în documentația pentru această excepție,
«Nu este permisă, în general, pentru un singur fir pentru a modifica o colecție în timp ce un alt fir este iterarea peste ea.»
În situația generală, inacceptabilă în cazul în care un fir (filet), modificări în colectarea în timp ce un alt fir trece prin ea.
3. Cum se convertesc Lista int [] matrice?
Cel mai simplu mod de a face acest lucru este de a utiliza ArrayUtils. variind în biblioteca Apache Commons Lang.
In JDK nici o reducere pentru această expresie. Amintiți-vă că nu puteți utiliza List.toArray (), deoarece această expresie convertește în lista Integer [] (care nu este un tip primitiv, aproximativ de traducere.). Modul corect este urmatoarea:
4. Cum de a converti o serie de int [] la listă?
Cel mai simplu mod este de a utiliza ca ArrayUtils în biblioteca Apache Commons Lang. ca mai sus.
De asemenea, nu există nici o reducere a JDK pentru acea expresie.
5. Care este cel mai bun mod de a filtra o colecție?
Puteți utiliza astfel de pachete, cum ar fi guava sau Apache Commons Lang pentru a crește funcționalitatea. Ambele aceste pachete au metoda de filtrare () (din clasa Collections2 din guava si CollectionUtils de Apache). filtru () returneaza elementele care se potrivesc predicatul luate (predicatului).
JDK mai greu. Vestea bună este că, în Java vor fi adăugate 8 predicate (deja adăugată. Aprox. De traducere.), Dar acum trebuie să utilizați un iterator pentru a trece prin întreaga colecție.
Desigur, puteți simula calea pe care urmează guava și Apache, după ce se familiarizeze cu noua interfață predicatului.
Acum putem folosi urmatorul cod pentru colectarea de filtrare:
6. Este ușor de a converti la listă Set?
Există două moduri de a face acest lucru, în funcție de modul în care doriți să definiți egalitatea. Prima piesă de cod plasează lista într-o HashSet. Duplicatul este apoi determinată în principal de hashCode (). De regulă, acest lucru va funcționa. Dar dacă trebuie să ia în considerare compararea drum, apoi Budel mai bine să se folosească de a doua parte a codului, pe care îl puteți defini propriul comparator.
7. Cum pot elimina elementele duplicate dintr-un ArrayList?
Această problemă este într-o anumită măsură, legat de întrebarea de mai sus.
În cazul în care nu contează ordinea elementelor într-un ArrayList, o mișcare inteligentă ar fi de a plasa foaia într-un set (Set) pentru a îndepărta dubliuatov, și apoi să se întoarcă înapoi la lista (List) pentru tine.
Mai jos este un exemplu.
Dacă comanda are o valoare de elemente, ordinul poate fi realizat prin plasarea listei în LinkedHashSet. care este în standardul JDK.
8. Colectia asortate
Există mai multe modalități de a sprijini colectarea sortate în Java. Toate acestea oferă colectarea în ordine naturală, sau la un comparator specificat. În cazul unei ordini naturale, de asemenea, aveți nevoie pentru a pune în aplicare elementul de interfață comparabili.
- Collections.sort () poate sorta lista. După cum se indică în documentația Java, această sortare este stabilă și asigură performanța n log (n).
- Oferă o coadă de coadă prioritară ordonată. Diferența dintre Collections.sort și coadă prioritară (), care menține ordinea cozile tot coadă prioritară timp, dar puteți obține doar primul element rând. Nu puteți primi un acces aleator la elemente, cum ar fi PriorityQueue.get (4).
- În cazul în care nu există nici o suprapunere în colectarea, puteți alege un TreeSet. De asemenea, ca și coadă prioritară, TreeSet menține un set ordonat de toate timpurile. Puteți obține malenny Sama sau un element de mare al TreeSet, dar tot nu se poate avea acces aleatoriu la elementele.
Pur și simplu pune, Collections.sort () oferă o listă o singură dată-a ordonat. TreeSet și sprijină coadă prioritară o colecție ordonată de a trebui să plătească în mod constant pentru lipsa de acces la articole indexate.
9. Collections.emptyList () sau o nouă instanță
Aceeași întrebare se aplică emptyMap () și emptySet ().
Ambele metode de a reveni o listă goală, dar imuabil lista (imuabile) Collections.emptyList (). Acest lucru înseamnă că nu puteți adăuga noi elemente în listă „gol“. Pe fondul fiecărei metode de apel Collections.emptyList () nu creează de fapt o nouă instanță a unei liste goale. In schimb, se va utiliza instanță existentă de gol din nou. Dacă sunteți familiarizat cu Singleton (Singleton, tyts. Aprox. De traducere.) Cum de a proiecta model, aveți nevoie pentru a înțelege ceea ce se înțelege. Acest lucru ar trebui să vă bo performanță mai mare când este invocată în mod frecvent.
Există două metode de a copia lista originală a desemnat. O modalitate - utilizarea ArrayList constructor.
Lista de destinație trebuie să fie cel puțin atât timp cât lista sursă.
Ceea ce înseamnă că lista finală nu ar trebui să fie mai scurtă decât originalul.
list.toArray (nou Integer [0]) - metoda foloseste reflecție pentru a crea o matrice pentru această metodă au nevoie de un tip de clasă pentru noua matrice. Ideea ar putea fi transferat pur și simplu Integer.class, dar puteți obiecții cu privire la faptul că, de asemenea, folosind getClass (și gunoi []) vyderut exact aceeași Integer.class. In cele din urma metoda statică ArrayUtils.toPrimitive va primi o serie de Integer [], care este deja la un teren int primitiv.
Da, spasibo.ya realizat. doar o astfel de abordare nu a avut videl.Tam dacă te uiți la SRC, impinge tu nul, dacă scrieți un nou Integer [n] pentru n mai mare decât lista.tozhe reală nu cele mai placute
Te înșeli. Colectia nevoie doar pentru a compara complexitatea (O mare) a metodelor lor.
Din AL O (1) puteți primi doar începutul și sfârșitul, este considerat un preparat varianta conform oricăreia dintre index, totuși O (n)
De ce ar trebui să compare în dificultate (O mare) a metodelor lor? Ai nevoie pentru a compara caracteristicile și beneficiile fiecărei colecții. mai degrabă decât metodele
Deci, aceasta face parte din caracteristici și beneficii reciproc lor. Complexitatea cu care practica metodele de bază de colectare (adăugați get remove)
După cum este scris de date pentru a adăuga metoda = Complexitate
-// - // - șterge = complexitatea metodei de eliminare
-// - // - selectat = complexitatea metodei get
Tu spui același lucru, dar cu alte cuvinte.
Atunci când alegeți o colecție trebuie să fie, de asemenea, luate în considerare, modul în care este stocat în obiecte (adăugând secvențial stocate, de sortare). Va fi utilizat într-un mediu multithreaded
Sunt conștient de faptul că există și alte metode, le-am observat ca bază. Ești prea accentuat pentru ei.
Și este de dorit să fie programat la nivel de interfață, nu implementări
nu, pentru este selectat exemplu, prin metode Select, mă refer la toate metodele, inclusiv getFirst (), getLast și așa mai departe ...
Și este de dorit să fie programat la nivel de interfață, nu implementări
Este de dorit, dar, de fapt, nu funcționează întotdeauna ...
Se pare aproape întotdeauna. Cu o colecție care e sigur funcționează întotdeauna. Uita-te toate metodele LL este realizarea de interfețe.
Dacă aveți nevoie să împrumute de la început de la sfârșitul anului, totul. Interfața are, de asemenea, o
docs.oracle.com/javase/7/docs/api/java/util/Deque.html