This shows you the differences between two versions of the page.
|
poo:breviare:breviar-07 [2025/11/17 13:00] george.tudor1906 |
poo:breviare:breviar-07 [2025/11/17 13:39] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 64: | Line 64: | ||
| == 1.2 Liste (List) == | == 1.2 Liste (List) == | ||
| - | Interfața **List**, pe lângă metodele moștenite din `Collection`, definește colecții: | + | Interfața **List**, pe lângă metodele moștenite din //Collection//, definește colecții **ordonate** și **indexate**, care **permit duplicate** și ale căror elemente pot fi accesate după **poziție** (index). În practică, cele mai folosite implementări sunt **ArrayList** și **LinkedList**. |
| - | * **ordonate** și **indexate**; | + | ArrayList oferă **acces aleator foarte rapid** la elemente, cu cost mai mare pentru inserări/ștergeri în interiorul listei. LinkedList stochează elementele într-o listă înlănțuită, ceea ce face **inserările și ștergerile** locale mai eficiente (folosind iteratorul), dar accesul la un element "din mijloc" este mai lent. LinkedList implementează și Deque, astfel că poate lucra comod cu elementele de la ambele capete (ex. addFirst, addLast). Pentru stivă/coadă se preferă ArrayDeque, iar pentru liste obișnuite ArrayList/LinkedList. |
| - | * care **permit duplicate**; | + | |
| - | * ale căror elemente pot fi accesate după **poziție** (index). | + | |
| - | + | ||
| - | Cele mai folosite implementări: | + | |
| - | + | ||
| - | * **ArrayList** – vector dinamic; acces aleator **rapid**, inserări/ștergeri în interiorul listei mai costisitoare; | + | |
| - | * **LinkedList** – listă înlănțuită; inserări/ștergeri locale mai eficiente (cu iterator), acces mai lent la elementele din „mijloc”; implementează și `Deque` (operare la ambele capete). | + | |
| - | + | ||
| - | Pentru comportament de **stivă/coadă** se preferă azi `ArrayDeque`, iar pentru liste obișnuite `ArrayList`/`LinkedList`. | + | |
| <code java> | <code java> | ||
| Line 81: | Line 72: | ||
| class Liste { | class Liste { | ||
| - | private final List<String> list1 = new ArrayList<>(); // ordonată, acces aleator rapid | + | private final List<String> list1 = new ArrayList<>(); // ordonată, acces aleator rapid |
| - | private final LinkedList<Integer> list2 = new LinkedList<>(); // listă + deque | + | private final LinkedList<Integer> list2 = new LinkedList<>(); // listă + deque |
| - | ``` | + | public static void main(String[] args) { |
| - | public static void main(String[] args) { | + | Liste obj = new Liste(); |
| - | Liste obj = new Liste(); | + | |
| - | // Operații de bază pe ArrayList<String> | + | // Operații de bază pe ArrayList<String> |
| - | obj.list1.add("Lab POO"); | + | obj.list1.add("Lab POO"); |
| - | obj.list1.add("Colectii"); | + | obj.list1.add("Colectii"); |
| - | obj.list1.add("Structuri de date"); | + | obj.list1.add("Structuri de date"); |
| - | if (obj.list1.contains("Colectii")) { | + | if (obj.list1.contains("Colectii")) { |
| - | System.out.println("Lista contine cuvantul"); | + | System.out.println("Lista contine cuvantul"); |
| - | } | + | } |
| - | // Parcurgere și ștergere în siguranță (fără ConcurrentModificationException) | + | // Parcurgere și ștergere în siguranță (fără ConcurrentModificationException) |
| - | Iterator<String> it = obj.list1.iterator(); | + | Iterator<String> it = obj.list1.iterator(); |
| - | while (it.hasNext()) { | + | while (it.hasNext()) { |
| - | String s = it.next(); | + | String s = it.next(); |
| - | System.out.println(s); | + | System.out.println(s); |
| - | it.remove(); // șterge elementul tocmai citit | + | it.remove(); // șterge elementul tocmai citit |
| - | } | + | } |
| - | // LinkedList<Integer> ca listă + deque (ambele capete) | + | // LinkedList<Integer> ca listă + deque (ambele capete) |
| - | obj.list2.addAll(Arrays.asList(1, 10, 20)); | + | obj.list2.addAll(Arrays.asList(1, 10, 20)); |
| - | obj.list2.addFirst(50); // capătul din stânga | + | obj.list2.addFirst(50); // capătul din stânga |
| - | obj.list2.addLast(17); // capătul din dreapta | + | obj.list2.addLast(17); // capătul din dreapta |
| - | // Modificare „pe loc” cu ListIterator (ex.: înmulțește numerele pare cu 10) | + | // Modificare „pe loc” cu ListIterator (ex.: înmulțește numerele pare cu 10) |
| - | ListIterator<Integer> li = obj.list2.listIterator(); | + | ListIterator<Integer> li = obj.list2.listIterator(); |
| - | while (li.hasNext()) { | + | while (li.hasNext()) { |
| - | int x = li.next(); | + | int x = li.next(); |
| - | if (x % 2 == 0) li.set(x * 10); | + | if (x % 2 == 0) li.set(x * 10); |
| - | } | + | } |
| - | // Afișare elemente (for-each) | + | // Afișare elemente (for-each) |
| - | for (Integer i : obj.list2) { | + | for (Integer i : obj.list2) { |
| - | System.out.println(i); | + | System.out.println(i); |
| + | } | ||
| + | |||
| + | // Sortare naturală (echivalent cu Collections.sort(list2)) | ||
| + | obj.list2.sort(Comparator.naturalOrder()); | ||
| + | System.out.println(obj.list2); | ||
| } | } | ||
| - | |||
| - | // Sortare naturală (echivalent cu Collections.sort(list2)) | ||
| - | obj.list2.sort(Comparator.naturalOrder()); | ||
| - | System.out.println(obj.list2); | ||
| } | } | ||
| - | ``` | + | </code> |
| - | + | ||
| - | } </code> | + | |
| <note tip> | <note tip> | ||
| - | * Declarați mereu tipul elementelor: `List<String>`, `List<Integer>`. | + | * Declarați mereu tipul elementelor: //List<String>//, //List<Integer>//. |
| - | * Pentru eliminări în timpul parcurgerii folosiți `Iterator.remove()` sau `removeIf(...)`. | + | * Pentru eliminări în timpul parcurgerii folosiți //Iterator.remove()// sau //removeIf(...)//. |
| - | * Alegeți **ArrayList** când accentul este pe citire după index și **LinkedList** când aveți inserări/ștergeri locale cu iteratorul sau operații la ambele capete. | + | * Alegeți **ArrayList** când accentul este pe citire după index și **LinkedList** când aveți inserări/ștergeri locale cu iteratorul sau operații la ambele capete. |
| </note> | </note> | ||