java.lang.Object Tato nejobecnější třída je kořenem hierarchického stromu. Nemá žádné dostupné atributy, má jen implicitní konstruktor a 11 přetížených, dostupných, instančních metod, které zdědí všechny další třídy - ať jsou definovány kdekoli a kýmkoli. public boolean equals(Object obj) - definuje relaci ekvivalence objektů: x.equal(y) vrací true právě tehdy, když x == y. Je-li tato metoda přepsána, bývá nutno přepsat metodu hashCode kvůli dodržení uzance, že ekvivalentní objekty musejí mít stejné hash kódy. public int hashCode( ) - vrací int číslo, přičemž: Musí vracet totéž číslo v jednom běhu. Ekvivalentní objekty (dle equals( ) ) musejí vracet totéž číslo. Neekvivalentní objekty (dle equals( ) ) nemusejí vracet různá čísla. Avšak vracení různých čísel zlepšuje funkci hashtable. PJV04
Třída java.lang.Object public final Class getClass( ) - vrací objekt typu Class, čímž lze typ každého objektu přesně identifikovat. public String toString( ) - vydává popisný řetěz. Doporučuje se tuto metodu v potomcích přepsat tak, aby vracený popisný řetěz vyjadřoval typ a stav objektu. Metoda se automaticky volá při konkatenaci a v metodách print(...) či println(...). public final void wait(...) throws InterruptedException - tyto metody umožňují zařadit objekt do čekárny. public final void notifyAll( ) - uvolňuje všechny objekty z čekárny. public final void notify( ) - uvolňuje objekt z čekárny. PJV04
Třída java.lang.Object protected Object clone( ) throws CloneNotSupportedException - umožňuje mělké klonování potomků. protected void finalize( ) throws Throwable - tuto metodu volá garbage collector když hodlá objekt zrušit. Potomek může metodu přepsat a provést nějakou údržbu. Pozn.: Garbage collector lze nuceně vyvolat metodou System.gc(). PJV04
Pole (Array) Pole a prvky pole se poznají podle hranatých závorek. K prvkům pole se přistupuje pomocí indexu v rozmezí 0 ... pole.length -1. Počet hranatých závorek udává dimensionalitu. Vícedimensionální pole se vytvoří skládáním jednodimensionálních a takové pak nemusí být rektangulární. Každé pole je objekt, na který se tudíž odkazujeme referenční proměnnou a tudíž může být referováno typem Object. Pomocí metody java.lang.getClass() lze zjistit vlastnosti pole. Dimensionalita se pak manifestuje počtem otevíracích hranatých závorek. Typy primitivních polí jsou vyznačeny písmeny takto: B, S, C, I, J, F, D, Z pro byte, short, char, int, long, float, double, boolean Typ referenčních polí je vyznačen písmenem L a úplným jménem třídy. PJV04
Pole (Array) Příklad: String[ ] s = { "AAA", " BBB", "CCC " }; System.out.println( s.getClass()+" "+Array.getLength(s) ); int [ ][ ] a = new int [ ][ ] { { 333, 666}, {777} }; System.out.println( a.getClass()+" "+Array.getLength(a) ); Vypíše: class [L java.lang.String; 3 class [ [ I 2 Třída java.util.Arrays umožňuje třídění, vyhledávání, vyplňování a porovnávání polí. Navazuje také na operace s kolekcemi. K rafinovanému zacházení slouží třída java.lang.reflect.Array, která umožňuje dynamicky vytvářet a modifikovat pole. PJV04
Kolekce (Collection) Kolekcí čili sbírkou se rozumí skupina objektů v paměti, organizovanou dle JCF (Java Collection Framework - tento rámec je standardní od Javy 1.2) je uložen ponejvíce v balíčku java.util a zahrnuje zejména: Interfejsy: Collection - sbírka objektů Set, SortedSet - sbírka unikátních objektů - případně uspořádaná Map, SortedMap - sbírka dvojic (zobrazení) objektů key value List - indexovaná sbírka objektů Comparator, java.lang.Comparable - pro porovnávání objektů Iterator, ListIterator, RandomAccess - pro přístup k prvkům Abstraktní třídy: AbstractCollection AbstractSet, AbstractMap, AbstractList, AbstractSequentialList PJV04
Kolekce (Collection) Třídy: ArrayList, LinkedList HashSet, LinkedHashSet, HashMap LinkedHashMap TreeSet, TreeMap Vector, Stack, Hashtable, Properties Arrays, Collections Algoritmy pro řazení, přesouvání, doplňování, kopírování a vyhledávaní PJV04
Java Collection Framework jen statické metody Set List Collections Abstract Collection Arrays SortedSet Abstract Set Abstract List ArrayList RandomAccess TreeSet HashSet Abstract Sequential List Vector Linked HashSet Linked List Stack třída abstr. třída interfejs extends implements PJV04 ALG
Java Collection Framework Nepatří do JCF Map Dictionary SortedMap Abstract Map Comparator Hashtable TreeMap HashMap Properties Identity HashMap Linked HashMap Weak HashMap Iterator ListIterator třída abstr. třída interfejs extends implements PJV04
Užité techniky interface HT RA BT LL HT+LL List - ArrayList - LinkedList - Set HashSet - - - LinkedHashSet SortedSet - - TreeSet - - Map HashMap - - - LinkedHashMap SortedMap - - TreeMap - - HT - hastable - rozmítaná tabulka, RA - resizable array - pole s proměnnou velikostí, BT - balanced tree - vyvážený strom, LL - linked list - spojový seznam. PJV04
Collection Interfejs Collection umožňuje jednotlivé i hromadné operace: Dotazy: int size( ) boolean isEmpty( ) boolean contains( Object o ) boolean containsAll( Collection c ) - true, obsahuje-li všechny prvky c Iterator iterator( ) Object[ ] toArray( ) Object[ ] toArray(Object a[ ] ) vytvoří pole daného typu takové velikosti, aby se do něj vešly všechny prvky z kolekce. Modifikace: boolean add( Object o ) boolean remove( Object o ) boolean ddAll( Collection c ) boolean removeAll( Collection c ) - odstraňuje všechny patřící do c boolean retainAll( Collection c ) - odstraňuje všechny mimo patřící do c void clear( ) PJV04
Collection Třída AbstractCollection implementuje Collection, abstraktními zůstávají pouze metody iterator( ) a size( ). Interfejs Iterator slouží k postupnému jednosměrnému výpisu sbírky v pořadí v závislosti na jejím typu. Interfejs ListIterator je potomkem Iteratoru a navíc má metody pro prohlížení oběma směry, získávání indexů a vkládání prvků. Interfejs RandomAccess je pouhý marker. PJV04
List Interfejs List je potomkem Collection, který vyžaduje indexovaný přístup k prvkům sbírky void add ( int index, Object element ) boolean addAll ( Collection c ) boolean addAll ( int index, Collection c ) Object get ( int index ) Object set ( int index, Object element ) Object remove (int index ) int indexOf ( Object o ) - hledání zepředu int lastIndexOf ( Object o ) - hledání zezadu ListIterator listIterator ( ) ListIterator listIterator ( int index ) List subList ( int fromIndex, int toIndex ) - pohled PJV04
AbstractList Třída AbstractList je potomkem třídy AbstractCollection a interfejsu List. Ta přidává jen metodu protected void removeRange( int, int) a abstraktními jsou jen metody get( int ) a size( ). AbstractList sleduje také modifikace a komodifikace. Má tři přímé potomky: AbstractSequentialList - polotovar pro sekvenční přístup s abstraktními metodami listIterator( int ) a size( ). ArrayList - nesynchronizovaná obdoba Vectoru. Vector je třída stará od 1.0 a je synchronizovaná - od verze 1.2 redefinovaná. Některé původní metody mají nově, systematičtěji nazvané ekvivalenty, např.: elementAt( int ) vs. get( int ). Radno používat ty, které jsou zavedené v příslušných interfejsech. Při probírce lépe použít Iterator iterator( ) než Enumeration elements( ). PJV04
ArrayList Třída ArrayList uchovává reference objektů v poli. Operace size, isEmpty, get, set, add, iterator, a listIterator probíhají v konstantním čase, ostatní v lineárním. Konstruktor a dvě metody nastavují kapacitu tj. velikost pole a tím ovlivňují nárok na paměť i četnost a čas realokací. Metoda ensureCapacity realokuje pole o polovinu větší, trimToSize realokuje na stávající velikost. Třída LinkedList Kolekce objektů je realizována technikou obousměrného spojového seznamu ve kterém se postupně hledá pomocí ListIteratoru. Příslušné operace mají tedy lineární časovou složitost. Pro synchronizaci je třeba zapouzdřit takto: List list = Collections.synchronizedList( new ArrayList( ) ); List list = Collections.synchronizedList( new LinkedList( ) ); PJV04
Stack (zásobník) Třída Stack (zásobník) je přímý potomek Vectoru s přidanými metodami: Object push ( Object x ) - vloží prvek na vrchol Object pop ( ) - odebere prvek z vrcholu Object peek ( ) - vrátí prvek z vrcholu, ale neodebere boolean empty ( ) int search ( Object x ) - pozice objektu od vrcholu počítaná od 1 Tato třída je stará z verze 1.0, synchronizovaná a užitečná ač nepatří do JCF. Její vlastní metody nelze využívat pomocí interfejsu List. PJV04
Set a SortedSet Interfejs Set je potomkem Collection Ve sbírce se nesmějí být duplikované prvky ( ve smyslu equals() ) a nanejvýš jedna reference null. Zvláštní pozornost musí být věnována případu jsou-li prvky obsahově proměnné. Tento interfejs nepřidává další metody. Interfejs SortedSet je potomkem Set a Comparator comparator( ) Object first( ) - vrací první (nejmenší) prvek SortedSet headSet( Object toElement ) - vrací pohled Object last( ) - vrací poslední (největší) prvek SortedSet subSet( Object fromElement, Object toElement ) SortedSet tailSet( Object fromElement ) - vrací pohled PJV04
AbstractSet a její potomci Třída AbstractSet přepisuje pouze metody equals( ), hashCode( ), removeAll( ). Abstraktními stále zůstavají iterator( ) a size ( ). Všichni následující konkrétní potomci jsou nesynchronizovaní. Třída HashSet umožňuje prvek null. Iterátor nezaručuje jakékoli pořadí. Operace jsou zprostředkovány třídou HashMap v O(1) čase. Třída LinkedHashSet je potomkem HashSet také umožňuje prvek null. Iterátor zaručuje výstup v pořadí vkládání a to i případě reinserce téhož prvku. Operace jsou zprostředkovány třídou LinkedHashMap v O(1) čase. Třída TreeSet navíc implementuje interfejs SortedSet. Zaručuje výstup výstup v rostoucím pořadí objektů ( buď dle Comparable anebo dodaného Comparatoru ). Iterátor zaručuje ryze vzrůstající pořadí. Operace jsou zprostředkovány třídou TreeMap v O( log n ) čase. PJV04
Map Interfejs Map definuje abstraktní metody: void clear ( ) boolean containsKey ( Object key ) boolean containsValue ( Object value ) Set entrySet ( ) Object get ( Object key ) boolean isEmpty ( ) Set keySet ( ) Object put ( Object key, Object value ) void putAll ( Map m ) Object remove ( Object key ) int size ( ) Collection values ( ) Map znamená zobrazení keys -> values, tedy klíčů ( množinu objektů ) na hodnoty ( multimnožinu objektů ). PJV04
SortedMap Interfejs SortedMap je potomkem Map a přidává abstraktní metody: Comparator comparator( ) Object firstKey( ) - vrací první (nejmenší) klíč SortedMap headMap( Object toKey ) - vrací pohled Object lastKey( ) - vrací poslední (největší) prvek SortedMap subMap( Object fromKey, Object toKey ) - vrací pohled SortedMap tailMap( Object fromKey ) - vrací pohled PJV04
AbstractMap Třída AbstractMap implementuje interfejs Map, ponechává abstraktní jen metodu entrySet ( ). Přidává metody: boolean containsKey ( Object x ) boolean containsValue ( Object x ) Třída HashMap je konkrétním potomkem třídy AbstractMap, umožňje null reference, není synchronizovaná. Třída Hashtable je starší obdobou HashMap, splňuje interfejs Map, je však potomkem zastaralé abstraktní třídy Dictionary, neumožňuje null reference, je synchronizovaná. Třída Properties je potomkem Hashtable, který umožňuje vstup i výstup pomocí proudů (streams). Třída TreeMap je konkrétním potomkem třídy AbstractMap která navíc implementuje interfejs SortedMap. Tedy udržuje unikátní klíče ve vzrůstající setříděném posloupnosti. PJV04
Comparator Interfejs Comparator definuje požadavky, které musí splňovat objekt rozhodující, který ze dvou objektů je větší. Jsou to metody: int compare( Object x, Object y ) - vrací <0, 0, >0 pro x<y, x==y, x>y boolean equals ( Object obj ) - srovnává objekty typu Comparator PJV04
Iterator a ListIterator Interfejs Iterator definuje požadavky, které musí splňovat objekt, kterým lze probírat sbírku. Jsou to metody: boolean hasNext ( ) - testuje zda jsou ještě další prvky Object next( ) - podá další prvek void remove( ) – odstraní prvek ze sbírky ListIterator je potomkem Iteratoru a přidává požadavky pro sekvenční přístup, přidávání, změny a indexování prvků těmito metodami: boolean hasNext ( ) - testuje zda jsou ještě další prvky Object previous( ) - podá další prvek int nextIndex( ) - index dalšího prvku int previousIndex( ) - index dalšího prvku void set( Object o ) void add( Object o ) PJV04
StringTokenizer Další třídy jsou velmi užitečné – nejsou součástí JCF Třída StringTokenizer je pomůcka pro separaci řetězu podle zadatelných delimiterů, kterými jsou jednotlivé znaky. Pomocí enumerace ( starší varianta iterátoru ) postupně získáme podřetězy - případně i delimitery. Příklad: String s = " delta = alfa * ( beta + gama ) "; Enumeration en = new StringTokenizer( s, "=+*() ", true ); while ( en.hasMoreElements( ) ) { String z = (String) en.nextElement( ); if ( z.equals (" ") ) continue; // Zde vrací z postupně od mezer oproštěné řetězy: // delta, =, alfa, *, (, beta, +, gama, ) . } PJV04
BitSet Třída BitSet slouží k operacím na indexované množině boolevských hodnot ( false / true ). Umožňuje operace AND, ANDNOT, OR, XOR, intersekci, inverzi, výběr podmnožiny, vyhledání nejbližšího prvku dané hodnoty, zjištění kardinality i hromadné modifikace. Množina je dynamicky rozšiřovatelná. PJV04
Zpracování času UTC čas ( po milisekundách od 1.1.1970 ) lze zjistit takto: long t = java.lang.System.currentTimeMillis( ); long t = new GregorianCalendar().getTimeInMillis(); long t = Calendar.getInstance().getTimeInMillis(); K zacházení s časovými údaji slouží následující třídy: Date - starší třída - značně deprecated. Calendar - abstraktní třída GregorianCalendar - konkrétní třída Kalendářové třídy respektují místní čas i zvyklosti ( TimeZone a Locale ). Volba jednotlivých údajů se zadává symbolicky - přičemž pozor: SUNDAY=1 ... SATURDAY=7, JANUARY=0 ... DECEMBER=11. Příklad: Calendar cal = Calendar.getInstance(); // cal zafixuje časové údaje a tiskne: System.out.println( cal.getTime( ) ); // Sat Mar 06 20:06:28 CET 2004 System.out.println( cal.get(cal.MONTH) );// 2 PJV04
Zpracování času Časové plánování a spouštění úloh umožňují třídy Timer a TimerTask. PJV04