|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Java (10) - Kontejnery I.Kontejnery (v Javě obvykle nazývané "kolekce") jsou objekty, které nám umožňují
snadno a efektivně spravovat variabilní hromadná data. Dají se s nimi
dělat úžasné věci.
Úvod do problematikyProč kontejneryPole, s nimiž jsme se seznámili v předchozích kapitolách, mají několik zásadních nevýhod. Nemohou měnit svoji velikost (mají předem daný počet prvků), lze k nim přistupovat jen podle číselného indexu, řazení prvků se musí provádět externě a explicitně, k manipulacím s poli nelze přidávat vedlejší efekty (které se někdy hodí). Proto už hodně dávno vzniklo něco, čemu se obecně říká kontejnery. Kontejner je datový objekt, obsahující "v sobě" nějaké další objekty, ke kterým lze různým způsobem přistupovat a pracovat s nimi. Podle způsobů uložení dat a práce s nimi rozlišujeme různé druhy kontejnerů a při jejich použití si vždy vybereme ten, který se pro daný případ nejlépe hodí. V Javě se kontejnerům většinou říká kolekce (proto budu v dalším textu používat i tento termín), jejich chování se částečně podobá kontejnerům, které programátoři v C++ znají z knihovny STL. S javovskými kolekcemi se však pracuje trochu odlišně - dá se říci názorněji, avšak za cenu většího množství napsaného kódu. The Collections FrameworkPod tímto názvem (dále budu používat "CF") se skrývá celý systém rozhraní a tříd, které bezprostředně souvisí s kolekcemi. Naprostou většinu z nich najdeme v balíku java.util (na jiné umístění včas upozorním). Důležitým faktem je, že v Javě 5.0 (tj. od JDK 1.5.0) došlo v CF k významným změnám (které CF částečně posunuly směrem k STL). Všechna další vysvětlení a příklady se budou týkat JDK verze 1.4.2, změny provedené ve verzi 1.5.0 uvedu na závěr. Práce s kolekcemi se rozhodně neomezuje jen na knihovnu CF, právě naopak. S výhodou si můžeme vytvářet vlastní kontejnery a implementovat např. různé vedlejší efekty operací, vlastní způsob uložení dat (když to hodně přeženu, kontejner lze třeba i přímo napojit na databázi), přidávat své vlastní operace atd. Kdo si dobře zažije práci s hotovými objekty, sám přijde na to, co mu případně chybí. Důležité pojmyI když není dobré přehánět to se suchou teorií, zde se jí (v zájmu dobrého pochopení funkce jednotlivých kontejnerů) težko vyhneme. Ale nebude jí mnoho... Iterátor je prostředek zajišťující sekvenční přístup k datům. Pracuje krokově, v každém dalším poskytne přístup k dalšímu prvku. Používá se tehdy, když potřebujeme postupně pracovat s jednotlivými prvky a buď nezáleží na pořadí, nebo pořadí vyplývá z vlastností kolekce, nad níž iterátor pracuje. Potřebujeme-li pracovat s prvky právě tímto způsobem (např. z každého něco přečíst), měli bychom vždy používat iterátory, protože bývají implementovány tak, aby to pro uvedené použití bylo nejrychlejší.
Porovnatelnost objektů je důležitá vlastnost, kterou potřebujeme pro uložení do některých kontejnerů.
Je to tehdy, když se objekty uspořádávají v přirozeném pořadí (v základním způsobu uspořádání).
Zjišťuje se, zda jsou objekty sobě rovny, nebo je jeden z nich "větší" či "menší" než druhý
(u číselných hodnot je význam jasný; ostatní datové objekty mohou mít porovnatelnost implementovánu
prakticky libovolným způsobem). V Javě je porovnatelnost zaručena tím, že třída implementuje
rozhraní
Většina standardních tříd rozhraní Volba vhodného kontejneruI když u každého typu kontejneru vždy vysvětlím, k čemu se daný typ hodí, obecný úvod udělám ihned. Máme totiž k dispozici širokou škálu kolekcí v různých kategoriích a správná volba je důležitá z hlediska dobré funkce programu a jeho rychlosti. Obvykle posuzujeme tato hlediska:
Poznámky pro programátory v C++Tvůrci Javy říkají, že zatímco v STL jsou středobodem iterátory, v javovských kolekcích jsou podružnou záležitostí - v řadě případů se obejdeme bez nich. Skutečně, u spousty použití kontejnerů v Javě o iterátory ani nezavadíme. Dostaneme se k tomu později v příkladech. Příjemnou věcí je naopak fakt, že narozdíl od STL se javovské kolekce chovají na všech platformách stejně (jako většina věcí v Javě). Další podstatný rozdíl je ten, že v Javě se obecně nevyskytují (až na malé výjimky), narozdíl od C++, přetížené operátory - to platí i pro kontejnery a s nimi spojené iterátory. Pracujeme s nimi prostřednictvím volání různých metod. Základy práce s kolekcemiJednoduchý příklad
Než se pustíme do postupného poznávání světa The Collections Framework, bude dobré si nejprve ukázat,
co to vlastně umí. Jako příklad jsem zvolil práci se třídou Vector v = new Vector(); // vytvoří instanci s výchozími parametry v.add("abcd"); // vloží textový řetězec v.add(new Integer(6)); // vloží celé číslo v.add(1, "efgh"); // vloží textový řetězec na pozici 1 System.out.println("Na pozici 1 je: " + v.elementAt(1)); System.out.println("Obsah vektoru:"); Iterator it = v.iterator(); while (it.hasNext()) { // opakuj, dokud jsou položky System.out.println(it.next()); // tisk další položky } v.clear(); // smazání obsahu
V uvedeném příkladě se vytvoří instance třídy
Na dalším řádku je vidět přímý přístup k prvku přes jeho index. Metoda
Pak tu máme ukázku práce s iterátorem. Ten získáme obecně metodou
Výše uvedený příklad a další podobný (složitější) najdete i s komentáři v ukázkovém zdrojovém souboru
Podrobnější seznámení s kolekcemiDoufám, že jsem vás tímto nezáživným, obecným a téměř ryze teoretickým úvodem do světa javovských kontejnerů neznechutil natolik, že byste o ně ztratili zájem. Byla by to škoda, příště totiž přijde řada na jednotlivé kategorie a konkrétní implementace kolekcí - jak pracují, co umí a neumí, k čemu se hodí a jak je správně použít.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |