Collection în Java

Interfața de bază pentru liste, mulțimi și cozi: metodele comune add, remove, contains, size și parcurgerea cu for-each.

Sintaxă
import java.util.Collection;

public interface Collection<E> extends Iterable<E>

int size()
boolean isEmpty()
boolean contains(Object o)
boolean add(E e)
boolean remove(Object o)
void clear()

Ce face Collection

Collection este „părintele” comun al colecțiilor din java.util: List, Set, Queue și Deque o extind. Ea definește operațiile pe care le are orice grup de elemente: adăugare (add), ștergere (remove), căutare (contains), numărare (size), golire (clear), plus operațiile în masă addAll, removeAll, retainAll, containsAll.

Collection nu spune nimic despre ordine sau duplicate: o listă păstrează ordinea și permite duplicate, o mulțime nu permite duplicate. Map nu este o Collection, dar îți dă colecții prin keySet(), values() și entrySet().

Folosește Collection<T> ca tip de parametru când metoda ta are nevoie doar să parcurgă sau să numere elementele. Așa poate primi la fel de bine o listă, o mulțime sau o coadă.

Parametri

Parametru Descriere
E Tipul elementelor din colecție.

Ce returnează

Este o interfață; obiectele concrete vin din ArrayList, HashSet, TreeSet, ArrayDeque etc.

Exemple

Exemplul 1: O metodă care primește orice colecție

Aceeași metodă medie primește o listă, un TreeSet și o coadă. Toate sunt Collection<Integer>.

import java.util.ArrayDeque;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;

public class Main {
    static double medie(Collection<Integer> note) {
        int suma = 0;
        for (int n : note) {
            suma += n;
        }
        return note.isEmpty() ? 0 : (double) suma / note.size();
    }

    public static void main(String[] args) {
        System.out.println("Listă: " + medie(List.of(9, 10, 8, 9)));
        System.out.println("Mulțime: " + medie(new TreeSet<>(List.of(9, 10, 8, 9))));
        System.out.println("Coadă: " + medie(new ArrayDeque<>(List.of(5, 6))));
    }
}

Rezultat

Listă: 9.0
Mulțime: 9.0
Coadă: 5.5

Exemplul 2: Operațiile comune pe o colecție

import java.util.ArrayList;
import java.util.Collection;

public class Main {
    public static void main(String[] args) {
        Collection<String> orase = new ArrayList<>();
        orase.add("Iași");
        orase.add("Cluj");
        orase.add("Sibiu");
        System.out.println(orase + ", mărime " + orase.size());
        System.out.println("Are Cluj? " + orase.contains("Cluj"));
        orase.remove("Cluj");
        System.out.println("După remove: " + orase);
        orase.clear();
        System.out.println("Goală? " + orase.isEmpty());
    }
}

Rezultat

[Iași, Cluj, Sibiu], mărime 3
Are Cluj? true
După remove: [Iași, Sibiu]
Goală? true

Exemplul 3: Același cod, comportament diferit: listă sau mulțime

add returnează false când mulțimea are deja elementul. Lista acceptă duplicatul.

import java.util.ArrayList;
import java.util.Collection;
import java.util.TreeSet;

public class Main {
    static void adauga(Collection<String> c) {
        System.out.print(c.add("Ana") + " ");
        System.out.print(c.add("Ana") + " ");
        System.out.println(c);
    }

    public static void main(String[] args) {
        adauga(new ArrayList<>());
        adauga(new TreeSet<>());
    }
}

Rezultat

true true [Ana, Ana]
true false [Ana]

Greșeli frecvente

  • Încerci colectie.get(0) pe o variabilă de tip Collection. Metoda get există doar în List; o colecție în general nu are poziții.
  • Crezi că Map este o Collection. Nu este; folosește map.keySet(), map.values() sau map.entrySet().
  • Folosești tipul brut Collection fără <T>. Compilatorul avertizează (rawtypes), iar cu -Werror codul nu se compilează.

Comenzi înrudite

  • List: Interfața pentru liste ordonate: elementele au poziții (0, 1, 2…), se pot repeta și se pot citi după index.
  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.
  • Queue: Interfața pentru cozi: elementele intră la coadă și ies din față, în ordinea sosirii (FIFO), ca la ghișeu.
  • Iterable: Interfața care permite bucla for-each: orice obiect Iterable poate fi parcurs cu for (T x : obiect) și cu forEach.
  • Collection.stream: Creează un Stream peste elementele colecției, ca să le filtrezi, transformi, sortezi sau aduni într-un rezultat.
  • Collection.addAll: Adaugă în colecție toate elementele altei colecții. Returnează true dacă s-a schimbat ceva.
  • Collection.toArray: Copiază elementele unei liste, mulțimi sau cozi într-un array nou, de tip Object[] sau de tipul ales (String[], Integer[]).