Kontejnery obecně, rozhraní
Collection
Kontejnery (dynamické datové struktury)
Co jsou kontejnery, kolekce (collections)?
• dynamické datové struktury vhodné k ukládání proměnného počtu objektů (přesněji odkazů na
objekty)
• jsou automaticky ukládané v operační paměti (ne na disk)
Proč je používat?
• pro uchování proměnného počtu objektů (počet prvků se může měnit — zvyšovat, snižovat)
• oproti polím nabízejí efektivnější algoritmy přístupu k prvkům
Kvalitní seznámení s kontejnery najdete na stránkach Oracle
Základní kategorie
Základní kategorie jsou dány tím, které rozhraní daný kontejner implementuje:
Seznam (List)
lineární struktura, každý prvek má svůj číselný index (pozici)
Množina (Set)
struktura bez duplicitních hodnot a (obecně) bez uspořádání
Mapa, slovník, asociativní pole (Map)
struktura uchovávající dvojice (klíč→hodnota), rychlý přístup přes klíč
Vlastní implementace se dá vytvořit implementováním zmíněných rozhraní.
Typové parametry
• v Javě byly dříve kontejnery koncipovány jako beztypové
• teď mají typové parametry ve špičatých závorkách (např. Set)
• určují, jaký typ položek se do kontejneru smí dostat
1
List objects; // without type, old!
List strings; // with type String
Kontejnery bez typů nepoužívat! (Vždy používejte špičaté závorky.)
Hierarchie kolekcí
Třídy jsou součástí Java Core API (balík java.util).
Collection
• Mezi třídy typu rozhraní Collection patří:
◦ rozhraní List, Set,… (ne však Map!)
◦ konkrétní implementace ArrayList, LinkedList, HashSet,…
• Vytvoření prázdné kolekce:
List listOfStrings = new ArrayList<>();
Collection collection = new HashSet<>();
List listWithValues = List.of("so", "cool");
Metody Collection I
Kolekce prvků typu E (tj. Collection) má následující metody:
2
• boolean add(E e)
◦ přidá prvek e do kolekce
◦ true jestli se skutečne přidal (využití u množin)
• int size()
◦ vrátí počet prvků v kolekci
• boolean isEmpty()
◦ true jestli je kolekce prázdná (velikost je 0)
Příklad metod Collection I
Collection set = new HashSet<>();
set.add("Pacman"); // true
set.add("Pacman"); // false
set.toString(); // ["Pacman"]
set.size(); // 1
set.isEmpty(); // false
Metody Collection II
• void clear()
◦ odstraní všechny prvky z kolekce
• boolean contains(Object o)
◦ true jestli se o nachází v kolekci
◦ na test rovnosti se použije equals
• boolean remove(Object o)
◦ odstraní prvek z kolekce
◦ true jestli byl prvek odstraněn
Příklad metod Collection II
3
List list = List.of("Hello", "world");
list.toString(); // ["Hello", "world"]
list.contains("Hello"); // true
list.remove("Hello"); // true
list.toString(); // ["world"]
list.contains("Hello"); // false
list.clear();
list.toString(); // []
Metody Collection III
• Iterator iterator()
◦ vrací něco, co se dá iterovat (procházet for-each cyklem)
• Jedná se o použití návrhového vzoru Iterator:
◦ Kolekce nenabízí přímo metody pro procházení. Místo toho vrací objekt (iterátor), který
umožňuje danou kolekci procházet jednotným způsobem bez ohledu na to, jak je kolekce
uvnitř implementovaná.
◦ Je možná i varianta, kdy procházení je umožněno jak specifickými metodami, tak
iterátorem. Příkladem je List, který nabízí metodu get(int i) pro přímé procházení i
obecný iterátor z důvodu kompatibility s ostatními kolekcemi.
Metody Collection IV
• T[] toArray(T[] a)
◦ vrátí pole typu T
◦ konverze kolekce na pole
◦ použití:
Collection c = List.of("a", "b", "c");
String[] stringArray = c.toArray(new String[0]);
// stringArray contains "a", "b", "c" elements
Metody Collection V
• boolean containsAll(Collection> c)
◦ true jestli kolekce obsahuje všechny prvky z c
Metody vracející true, když byla kolekce změněna:
4
• boolean addAll(Collection c)
◦ přidá do kolekce všechny prvky z c
• boolean removeAll(Collection> c)
◦ udělá rozdíl kolekcí (this - c)
• boolean retainAll(Collection> c)
◦ udělá průnik kolekcí
Výraz Collection> reprezentuje kolekci jakéhokoliv typu.
Příklad metod Collection V
Collection c1 = List.of("A", "A", "B");
Collection c2 = Set.of("A", "B", "C");
c1.containsAll(c2); // false
c2.containsAll(c1); // true
c1.retainAll(c2); // true
// c1 ["A", "B"]
c1.removeAll(c2); // true
// c1 []
c1.addAll(c2); // true
// c1 ["A", "B", "C"]
Repl.it demo ke kontejnerům
• https://repl.it/@tpitner/PB162-Java-Lecture-07-collections
5