Exerciții și Întrebări - Colecții în Java
1. Interfețe și Ierarhie
Întrebare: Care sunt principalele interfețe din framework-ul Java Collections și ce relație există între ele?
Exercițiu: Desenează manual o diagramă simplificată care să arate relația ierarhică între interfețele Iterable
, Collection
, List
, Set
, Queue
și Map
. Indică pentru fiecare interfață principala caracteristică care o diferențiază de celelalte.
2. ArrayList vs LinkedList
Întrebare: Care sunt diferențele principale între ArrayList
și LinkedList
din punct de vedere al performanței și al utilizării?
Exercițiu: Creează o clasă PerformantaListe
care să conțină o metodă main
unde să compari timpul de execuție pentru:
Adăugarea a 100,000 de elemente la începutul listei
Adăugarea a 100,000 de elemente la sfârșitul listei
Accesarea aleatoare a 10,000 de elemente Efectuează aceste operații atât pentru
ArrayList
cât și pentruLinkedList
și afișează rezultatele.
3. Seturi și Eliminarea Duplicatelor
Întrebare: De ce am folosi un LinkedHashSet
în loc de un HashSet
sau un TreeSet
?
Exercițiu: Creează o metodă eliminaDuplicate(List<String> lista)
care să primească o listă de cuvinte și să returneze o nouă colecție care conține cuvintele unice în ordinea primei lor apariții în lista originală. Implementează metoda în două moduri: folosind LinkedHashSet
și folosind ArrayList
cu verificări manuale.
4. Maps și Procesarea Datelor
Întrebare: Ce diferențe există între HashMap
, LinkedHashMap
și TreeMap
din punct de vedere al performanței și garanțiilor de ordonare?
Exercițiu: Creează o clasă AnalizatorText
care să proceseze un text (String) și să numere frecvența fiecărui cuvânt. Implementează o metodă afiseazaTopCuvinte(int n)
care să afișeze cele mai frecvente n cuvinte din text, în ordine descrescătoare a frecvenței. Folosește o structură de tip Map pentru a stoca frecvențele.
5. Queue și Stack
Întrebare: Care este diferența între interfețele Queue
și Deque
în Java și ce implementări concrete ale acestora cunoști?
Exercițiu: Implementează o clasă VerificatorParanteze
care să verifice dacă într-un șir de caractere parantezele sunt corect închise (fiecare paranteză deschisă are o paranteză închisă corespunzătoare în ordine corectă). De exemplu, șirul "((()))" este valid, dar "(()" nu este valid. Folosește o structură de tip Stack pentru implementare.
6. Comparare și Sortare
Întrebare: Explică diferența dintre interfețele Comparable
și Comparator
în Java. În ce situații ai folosi pe fiecare dintre ele?
Exercițiu: Creează o clasă Produs
cu atributele nume
, pret
și categorie
. Implementează interfața Comparable
astfel încât produsele să fie sortate implicit după preț. Apoi, creează un Comparator
separat care să sorteze produsele după categorie și apoi după nume. Demonstrează utilizarea ambelor metode de sortare într-o metodă main
.
7. Operații pe Stream-uri
Întrebare: Care sunt avantajele utilizării Stream API în Java 8+ față de metodele tradiționale de procesare a colecțiilor?
Exercițiu: Având o listă de obiecte Student
cu atributele nume
, varsta
și nota
, folosește Stream API pentru a:
Filtra studenții cu note peste 8
Grupa studenții după vârstă
Calcula media notelor pentru fiecare grupă de vârstă
Afișa rezultatele sortate după vârstă
8. Colecții Imutabile și Thread-Safe
Întrebare: De ce și când ar trebui să folosim colecții imutabile sau colecții thread-safe?
Exercițiu: Creează un exemplu de clasă RegistruUtilizatori
care menține o listă de utilizatori. Implementează metode pentru adăugarea și obținerea utilizatorilor, asigurându-te că lista internă nu poate fi modificată direct din exterior (folosind colecții imutabile). Apoi, modifică implementarea pentru a o face thread-safe.
9. Performanță și Alegerea Colecției Potrivite
Întrebare: Care sunt criteriile principale de care ții cont când alegi tipul de colecție pentru o anumită problemă?
Exercițiu: Pentru fiecare dintre următoarele scenarii, specifică ce implementare de colecție ai alege și explică motivul: a) Un cache care memorează cele mai recente 100 de interogări către o bază de date b) Stocarea elementelor unice dintr-un flux de date, cu necesitatea de a verifica frecvent dacă un element există deja c) Menținerea unei liste de evenimente cronologice cu posibilitatea de a adăuga noi evenimente doar la final d) Un dicționar de cuvinte care trebuie să afișeze cuvintele în ordine alfabetică
10. Colecții Generice
Întrebare: Care sunt avantajele utilizării colecțiilor generice (List<String>
) față de colecțiile raw (List
)?
Exercițiu: Creează o clasă generică Pereche<K, V>
care stochează două valori de tipuri potențial diferite. Implementează metodele getFirst()
, getSecond()
, setFirst()
și setSecond()
. Apoi, implementează o metodă statică generică swap
care primește o Pereche<K, V>
și returnează o Pereche<V, K>
cu valorile inversate.
11. Exercițiu Complet - Sistem de Gestionare a Bibliotecii
Creează un sistem simplu de gestionare a unei biblioteci cu următoarele funcționalități:
Clasa
Carte
cu atributele:id
,titlu
,autor
,anPublicare
,genLiterar
Clasa
Biblioteca
care gestionează o colecție de cărți și oferă următoarele operațiuni:Adăugarea unei cărți
Căutarea cărților după titlu sau autor (returnând o listă de potriviri)
Împrumutarea unei cărți (marcarea ca împrumutată)
Returnarea unei cărți
Afișarea tuturor cărților disponibile
Afișarea cărților grupate după gen literar
Afișarea celor mai populare cărți (bazat pe numărul de împrumuturi)
Implementează acest sistem folosind colecțiile Java potrivite pentru fiecare funcționalitate, ținând cont de eficiența operațiilor.
12. Exercițiu Practic - Analizor de Log-uri
Creează un program care să analizeze un fișier de log-uri (pe care îl poți simula printr-un String mare). Fiecare linie de log are formatul:
[NIVEL] TIMESTAMP IP_ADRESA: MESAJ
Unde NIVEL poate fi: INFO, WARNING, ERROR sau CRITICAL.
Implementează următoarele funcționalități:
Parsarea log-ului și stocarea într-o structură de date adecvată
Filtrarea log-urilor după nivel
Căutarea log-urilor care conțin un anumit text în mesaj
Afișarea numărului de log-uri pentru fiecare nivel
Identificarea adreselor IP care au generat cele mai multe erori (ERROR sau CRITICAL)
Afișarea cronologică a log-urilor pentru o anumită adresă IP
Folosește colecțiile Java potrivite pentru fiecare din cerințele de mai sus.
Last updated