Listele sunt structuri de date utilizate în mod obișnuit în fiecare limbaj de programare.

În acest tutorial vom investiga lista API Java. Vom începe cu operațiuni de bază și apoi vom intra în lucruri mai avansate (cum ar fi o comparație a diferitelor tipuri de liste, cum ar fi ArrayList și LinkedList).

De asemenea, vă voi oferi câteva linii directoare pentru a vă ajuta să alegeți implementarea listei care este cea mai bună pentru situația dvs.

Deși cunoștințele de bază Java sunt suficiente pentru urmarea tutorialului, ultima secțiune necesită structuri de date de bază (Array, LinkedList) și Big-O cunoştinţe. Dacă nu sunteți familiarizați cu acestea, nu ezitați să ignorați secțiunea respectivă.

Definiția Lists

Listele sunt colecții ordonate de obiecte. Sunt similare cu secvențele din matematică în acest sens. Cu toate acestea, acestea sunt diferite de seturi care nu au o anumită ordine.

Câteva lucruri de reținut: listele pot avea duplicate și elemente nule. Sunt tipuri de referință sau de obiect și, ca toate obiectele din Java, sunt stocate în heap.

O listă în Java este o interfață și există multe tipuri de liste care implementează această interfață.

Tutorial Metode Java List Exemplu API Util List
Ierarhia colecției

Voi folosi ArrayList în primele câteva exemple, deoarece este cel mai frecvent tip de listă.

ArrayList este practic o matrice redimensionabilă. Aproape întotdeauna, doriți să utilizați ArrayList peste matricele obișnuite, deoarece acestea oferă multe metode utile.

Singurul avantaj al unui tablou era dimensiunea sa fixă ​​(prin alocarea mai mult spațiu decât aveți nevoie). Dar listele acceptă și dimensiunile fixe acum.

Cum se creează o listă în Java

Destul de chat, să începem prin crearea listei noastre.

import java.util.ArrayList;
import java.util.List;

public class CreateArrayList {
    public static void main(String[] args) {
        ArrayList<Integer> list0 = new ArrayList<>();

        // Makes use of polymorphism
        List list = new ArrayList<Integer>();

        // Local variable with "var" keyword, Java 10
        var list2 = new ArrayList<Integer>();
    }
}

În parantezele unghiulare (<>) specificăm tipul de obiecte pe care urmează să le stocăm.

Rețineți că tipul dintre paranteze trebuie să fie un tip de obiect și nu un tip primitiv. Prin urmare, trebuie să folosim împachetări de obiecte, clasa Integer în loc de int, Double în loc de double și așa mai departe.

Există multe modalități de a crea o listă ArrayList, dar am prezentat trei moduri comune în fragmentul de mai sus.

Prima modalitate este prin crearea obiectului din clasa concretă ArrayList prin specificarea ArrayList în partea stângă a atribuirii.

Al doilea fragment de cod folosește polimorfismul utilizând lista din partea stângă. Acest lucru face ca atribuirea să fie cuplată slab cu clasa ArrayList și ne permite să alocăm cu ușurință alte tipuri de liste și să trecem cu ușurință la o altă listă de implementare.

A treia modalitate este modalitatea Java 10 de a crea variabile locale utilizând cuvântul cheie var. Compilatorul interpretează tipul de variabilă verificând partea dreaptă.

Putem vedea că toate sarcinile au același tip:

System.out.println(list0.getClass());
System.out.println(list.getClass());
System.out.println(list2.getClass());

Ieșire:

class java.util.ArrayList
class java.util.ArrayList
class java.util.ArrayList

De asemenea, putem specifica capacitatea inițială a listei.

List list = new ArrayList<>(20);

Acest lucru este util deoarece ori de câte ori lista se completează și încercați să adăugați un alt element, lista curentă este copiată într-o listă nouă cu capacitatea dublă a listei anterioare. Totul se întâmplă în culise.

Această operație ne face complexitatea Pe), totuși, așa că vrem să o evităm. Capacitatea implicită este 10, deci dacă știți că veți stoca mai multe elemente, ar trebui să specificați capacitatea inițială.

Cum se adaugă și se actualizează elementele listei în Java

Pentru a adăuga elemente la listă putem folosi adăuga metodă. De asemenea, putem specifica indexul noului element, dar fiți precauți atunci când faceți acest lucru, deoarece poate avea ca rezultat un IndexOutOfBoundsException.

import java.util.ArrayList;

public class AddElement {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add(1, "world");
        System.out.println(list);
    }
}

Ieșire:

[hello, world]

Putem folosi a stabilit metoda de actualizare a unui element.

list.set(1, "from the otherside");
System.out.println(list);

Ieșire:

[hello, world]
[hello, from the otherside]

Cum se recuperează și se șterg elemente de listă în Java

Pentru a prelua un element din listă, puteți utiliza fișierul obține metoda și furnizați indexul elementului pe care doriți să îl obțineți.

import java.util.ArrayList;
import java.util.List;

public class GetElement {
    public static void main(String[] args) {
        List list = new ArrayList<String>();
        list.add("hello");
        list.add("Routech");

        System.out.println(list.get(1));
    }
}

Ieșire:

Routech

Complexitatea acestei operațiuni pe ArrayList este O (1) deoarece folosește o matrice regulată de acces aleatoriu în fundal.

Pentru a elimina un element din ArrayList, elimina se folosește metoda.

list.remove(0);

Aceasta elimină elementul de la indexul 0, care este „salut” în acest exemplu.

De asemenea, putem apela metoda de eliminare cu un element pentru a o găsi și a o elimina. Rețineți că elimină prima apariție a elementului doar dacă este prezent.

public static void main(String[] args) {
        List list = new ArrayList();
        list.add("hello");
        list.add("Routech");
        list.add("Routech");

        list.remove("Routech");
        System.out.println(list);
    }

Ieșire:

[hello, Routech]

Pentru a elimina toate aparițiile, putem folosi inlătură tot metoda în același mod.

Aceste metode se află în interfața List, deci fiecare implementare a Listei le are (indiferent dacă este vorba de ArrayList, LinkedList sau Vector).

Cum se obține lungimea unei liste în Java

Pentru a obține lungimea unei liste sau numărul de elemente, putem folosi mărimea() metodă.

import java.util.ArrayList;
import java.util.List;

public class GetSize {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("Welcome");
        list.add("to my post");
        System.out.println(list.size());
    }
}

Ieșire:

2

Liste bidimensionale în Java

Este posibil să creați liste bidimensionale, similare cu matricile 2D.

ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<>();

Folosim această sintaxă pentru a crea o listă de liste și fiecare listă interioară stochează numere întregi. Dar nu am inițializat încă listele interioare. Trebuie să le creăm și să le punem noi înșine pe această listă:

int numberOfLists = 3;
for (int i = 0; i < numberOfLists; i++) {
    listOfLists.add(new ArrayList<>());
}

Îmi inițializez listele interioare și adaug 3 liste în acest caz. De asemenea, pot adăuga liste mai târziu, dacă este nevoie.

Acum putem adăuga elemente la listele noastre interioare. Pentru a adăuga un element, trebuie să obținem mai întâi referința la lista interioară.

De exemplu, să presupunem că dorim să adăugăm un element la prima listă. Trebuie să obținem prima listă, apoi să o adăugăm.

listOfLists.get(0).add(1);
Adăugarea de elemente la lista 2D

Iată un exemplu pentru dvs. Încercați să ghiciți rezultatul segmentului de cod de mai jos:

public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<>();
        System.out.println(listOfLists);
        int numberOfLists = 3;
        for (int i = 0; i < numberOfLists; i++) {
            listOfLists.add(new ArrayList<>());
        }

        System.out.println(listOfLists);

        listOfLists.get(0).add(1);
        listOfLists.get(1).add(2);
        listOfLists.get(2).add(0,3);

        System.out.println(listOfLists);
}

Ieșire:

[]
[[], [], []]
[[1], [2], [3]]

Observați că este posibil să imprimați listele direct (spre deosebire de matricele obișnuite) deoarece acestea înlocuiesc toString () metodă.

Metode utile în Java

Există câteva alte metode și comenzi rapide utile care sunt utilizate frecvent. În această secțiune vreau să vă familiarizez cu unele dintre ele, astfel încât să aveți un timp mai ușor de lucru cu listele.

Cum se creează o listă cu elemente în Java

Este posibil să creați și să completați lista cu unele elemente într-o singură linie. Există două modalități de a face acest lucru.

Următorul este modul vechii școli:

public static void main(String[] args) {
        List<String> list = Arrays.asList(
                                "Routech",
                                "let's",
                                "create");
 }

Trebuie să fii precaut cu privire la un lucru atunci când folosești această metodă: Arrays.asList returnează o listă imuabilă. Deci, dacă încercați să adăugați sau să eliminați elemente după crearea obiectului, veți primi un UnsupportedOperationException.

S-ar putea să fiți tentat să folosiți final cuvânt cheie pentru a face lista imuabilă, dar nu va funcționa conform așteptărilor.

Se asigură doar că referința la obiect nu se schimbă – nu îi pasă de ceea ce se întâmplă în interiorul obiectului. Deci permite inserarea și scoaterea.

final List<String> list2 = new ArrayList<>();
list2.add("erinc.io is the best blog ever!");
System.out.println(list2);

Ieșire:

[erinc.io is the best blog ever!]

Acum să ne uităm la modul modern de a face acest lucru:

ArrayList<String> friends =  new ArrayList<>(List.of("Gulbike", "Sinem", "Mete"));

Lista de metoda a fost livrată cu Java 9. Această metodă returnează și o listă imuabilă, dar o putem transmite constructorului ArrayList pentru a crea o listă mutabilă cu acele elemente. Putem adăuga și elimina elemente în această listă fără probleme.

Cum se creează o listă cu N copii ale unor elemente din Java

Java oferă o metodă numită NCopies acest lucru este util mai ales pentru benchmarking. Puteți umple o matrice cu orice număr de elemente dintr-o singură linie.

public class NCopies {
    public static void main(String[] args) {
        List<String> list = Collections.nCopies(10, "HELLO");
        System.out.println(list);
    }
}

Ieșire:

[HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO, HELLO]

Cum se clonează o listă în Java

După cum sa menționat anterior, listele sunt tipuri de referință, deci regulile din trecând prin referință aplică asupra lor.

public static void main(String[] args) {
        List list1 = new ArrayList<String>();
        list1.add("Hello");
        List list2 = list1;
        list2.add(" World");

        System.out.println(list1);
        System.out.println(list2);
}

Ieșire:

[Hello,  World]
[Hello,  World]

Variabila list1 deține o referință la listă. Când îl atribuim listei2, indică și același obiect. Dacă nu dorim ca lista originală să se schimbe, putem clona lista.

ArrayList list3 = (ArrayList) list1.clone();
list3.add(" Of Java");

System.out.println(list1);
System.out.println(list3);

Ieșire:

[Hello,  World]
[Hello,  World,  Of Java]

Deoarece am clonat list1, list3 deține o referință la clona sa în acest caz. Prin urmare, lista1 rămâne neschimbată.

Cum să copiați o listă într-o matrice în Java

Uneori trebuie să vă convertiți lista într-o matrice pentru a o transfera într-o metodă care acceptă o matrice. Puteți utiliza următorul cod pentru a realiza acest lucru:

List<Integer> list = new ArrayList<>(List.of(1, 2));
Integer[] toArray = list.toArray(new Integer[0]);

Trebuie să treceți o matrice și fișierul toArray metoda returnează acea matrice după ce o completează cu elementele listei.

Cum se sortează o listă în Java

Pentru a sorta o listă pe care o putem folosi Colecții.sort. Se sortează în ordine crescătoare în mod implicit, dar puteți trece și un comparator pentru a sorta cu logica personalizată.

List<Integer> toBeSorted = new ArrayList<>(List.of(3,2,4,1,-2));
Collections.sort(toBeSorted);
System.out.println(toBeSorted);

Ieșire:

[-2, 1, 2, 3, 4]

Cum aleg ce tip de listă să folosesc?

Înainte de a termina acest articol, vreau să vă ofer o scurtă comparație de performanță a diferitelor implementări ale listei, astfel încât să puteți alege care este cea mai bună pentru cazul dvs. de utilizare.

Vom compara ArrayList, LinkedList și Vector. Toate au urcușuri și coborâșuri, așa că asigurați-vă că luați în considerare contextul specific înainte de a vă decide.

Java ArrayList vs LinkedList

Iată o comparație a timpilor de rulare în termeni de complexitate algoritmică.

|                       | ArrayList                  | LinkedList |
|-----------------------|----------------------------|------------|
| GET(index)            | O(1)                       | O(n)       |
| GET from Start or End | O(1)                       | O(1)       |
| ADD                   | O(1), if list is full O(n) | O(1)       |
| ADD(index)            | O(n)                       | O(1)       |
| Remove(index)         | O(n)                       | O(1)       |
| Search and Remove     | O(n)                       | O(n)       |

În general, obține operația este mult mai rapidă pe ArrayList, dar adăuga și elimina sunt mai rapide pe LinkedList.

ArrayList folosește o matrice din spatele scenei și, ori de câte ori este eliminat un element, elementele matrice trebuie schimbate (care este un Pe) Operațiune).

Alegerea structurilor de date este o sarcină complexă și nu există nicio rețetă care să se aplice fiecărei situații. Totuși, voi încerca să vă ofer câteva instrucțiuni pentru a vă ajuta să luați decizia mai ușor:

  • Dacă intenționați să faceți mai multe operații de obținere și adăugare, altele decât eliminarea, utilizați ArrayList, deoarece operațiunea de obținere este prea costisitoare pe LinkedList. Rețineți că inserarea este O (1) numai dacă îl apelați fără a specifica indexul și adăugați la sfârșitul listei.
  • Dacă aveți de gând să eliminați elemente și / sau să inserați în mijloc (nu la sfârșit) frecvent, puteți lua în considerare trecerea la un LinkedList, deoarece aceste operațiuni sunt costisitoare pe ArrayList.
  • Rețineți că, dacă accesați elementele secvențial (cu un iterator), nu veți experimenta o pierdere de performanță cu LinkedList în timp ce obțineți elemente.
1611727568 257 Tutorial Metode Java List Exemplu API Util List
Sursă de referință: programcreek

Java ArrayList vs Vector

Vectorul este foarte asemănător cu ArrayList. Dacă provii dintr-un fundal C ++, s-ar putea să fii tentat să folosești un Vector, dar cazul său de utilizare este puțin diferit de C ++.

Metodele Vectorului au sincronizat cuvânt cheie, deci Vector garantează siguranța firului, în timp ce ArrayList nu.

S-ar putea să preferați Vectorul peste ArrayList în programarea cu mai multe fire sau puteți utiliza ArrayList și să gestionați singur sincronizarea.

Într-un program cu un singur fir, este mai bine să rămâneți cu ArrayList, deoarece siguranța firului vine cu un cost de performanță.

Concluzie

În această postare, am încercat să ofer o prezentare generală a API-ului Java’s List. Am învățat să folosim metode de bază și am analizat și câteva trucuri mai avansate pentru a ne ușura viața.

De asemenea, am făcut o comparație între ArrayList, LinkedList și Vector, care este un subiect frecvent întrebat în interviuri.

Vă mulțumesc că ați acordat timp pentru a citi întregul articol și sper că a fost de ajutor.

Puteți accesa întregul cod din acesta repertoriu.

Dacă sunteți interesat să citiți mai multe articole de acest gen, vă puteți abona la blogului listă de discuții pentru a fi notificat atunci când public un articol nou.