Kontejnery. Březen 2008



Similar documents
Class 32: The Java Collections Framework

Data Structures in the Java API

JAVA COLLECTIONS FRAMEWORK

Collections in Java. Arrays. Iterators. Collections (also called containers) Has special language support. Iterator (i) Collection (i) Set (i),

API for java.util.iterator. ! hasnext() Are there more items in the list? ! next() Return the next item in the list.

Generic Types in Java. Example. Another Example. Type Casting. An Aside: Autoboxing 4/16/2013 GENERIC TYPES AND THE JAVA COLLECTIONS FRAMEWORK.

The Java Collections Framework

Working with Java Collections

Basic Programming and PC Skills: Basic Programming and PC Skills:

Jazyk C# (seminář 8)

D06 PROGRAMMING with JAVA

core 2 Basic Java Syntax

Konzepte objektorientierter Programmierung

e ag u g an L g ter lvin v E ram Neal G g ro va P Ja

Java Coding Practices for Improved Application Performance

CS 111 Classes I 1. Software Organization View to this point:

BIRD Internet Routing Daemon

CSE 2123 Collections: Sets and Iterators (Hash functions and Trees) Jeremy Morris

Crash Course in Java

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

dictionary find definition word definition book index find relevant pages term list of page numbers

Paralelismus. Březen 2008

AP Computer Science Java Subset

cs2010: algorithms and data structures

Automatizovaná formální verifikace

aneb Perfektní minulost.

Java Cheatsheet. Tim Coppieters Laure Philips Elisa Gonzalez Boix

JDK 1.5 Updates for Introduction to Java Programming with SUN ONE Studio 4

First Java Programs. V. Paúl Pauca. CSC 111D Fall, Department of Computer Science Wake Forest University. Introduction to Computer Science

Arrays. Atul Prakash Readings: Chapter 10, Downey Sun s Java tutorial on Arrays:

CS 2112 Spring Instructions. Assignment 3 Data Structures and Web Filtering. 0.1 Grading. 0.2 Partners. 0.3 Restrictions

Introduction to Java

STORM. Simulation TOol for Real-time Multiprocessor scheduling. Designer Guide V3.3.1 September 2009

Object-Oriented Design Lecture 4 CSU 370 Fall 2007 (Pucella) Tuesday, Sep 18, 2007

Java Training - A Brief Summary of Objects

Stacks and queues. Algorithms and Data Structures, Fall Rasmus Pagh. Based on slides by Kevin Wayne, Princeton

Java Interview Questions and Answers

Scanner. It takes input and splits it into a sequence of tokens. A token is a group of characters which form some unit.

Chapter 2 Introduction to Java programming

Neural networks in data mining

Upozorňujeme,že můžete formáty pro čtečky převádět ON-LINE na internetu do formátu PDF apod.

Computer Programming I

Pemrograman Dasar. Basic Elements Of Java

The following program is aiming to extract from a simple text file an analysis of the content such as:

Java Programming Fundamentals

Practical Session 4 Java Collections

Economic efficiency of agricultural enterprises and its evaluation

1.00 Lecture 1. Course information Course staff (TA, instructor names on syllabus/faq): 2 instructors, 4 TAs, 2 Lab TAs, graders

MULTIPLE CHOICE. Choose the one alternative that best completes the statement or answers the question.

An Overview of Java. overview-1

Computer. Course Description

Example of a Java program

CMSC 202H. ArrayList, Multidimensional Arrays

LINKED DATA STRUCTURES

Java Map and Set collections

CSC 551: Web Programming. Fall 2001

Masters programmes in Computer Science and Information Systems. Object-Oriented Design and Programming. Sample module entry test xxth December 2013

Design Patterns. Advanced Software Paradigms (A. Bellaachia) 1

1.00 Lecture 35. Data Structures: Introduction Stacks, Queues. Reading for next time: Big Java: Data Structures

Lecture 2: Data Structures Steven Skiena. skiena

Chulalongkorn University International School of Engineering Department of Computer Engineering Computer Programming Lab.

: provid.ir


Quick Introduction to Java

Software Development with UML and Java 2 SDJ I2, Spring 2010

ARP,TCP,IP utility -zjednodusene a rychle Jiri Kubina jiri.kubina@osu.cz Ver. 1.0 leden 2006

4.5 Symbol Table Applications

The Sun Certified Associate for the Java Platform, Standard Edition, Exam Version 1.0

Problem 1. CS 61b Summer 2005 Homework #2 Due July 5th at the beginning of class

Java 6 'th. Concepts INTERNATIONAL STUDENT VERSION. edition

Creating a Simple, Multithreaded Chat System with Java

CS5233 Components Models and Engineering

Java in High-Performance Computing

Collections Classes for Real-Time and High-Performance Applications. July 4, 2005 Jean-Marie Dautelle

#820 Computer Programming 1A

Programming Languages CIS 443

Java Interfaces. Recall: A List Interface. Another Java Interface Example. Interface Notes. Why an interface construct? Interfaces & Java Types

Software Engineering Techniques

COSC Introduction to Computer Science I Section A, Summer Question Out of Mark A Total 16. B-1 7 B-2 4 B-3 4 B-4 4 B Total 19

CS 141: Introduction to (Java) Programming: Exam 1 Jenny Orr Willamette University Fall 2013

Contents. 9-1 Copyright (c) N. Afshartous

Core Java+ J2EE+Struts+Hibernate+Spring

Market Consistent Embedded Value

Introducing Variance into the Java Programming Language DRAFT

Java the UML Way: Integrating Object-Oriented Design and Programming

TR 314 2R2 / J TR 311 Ö TR 313 TR 314 Ö TR 319 TR 331 Ö TR 336 TRA 25 Ö TRA 100 TR 323, TR

Evaluation. Copy. Evaluation Copy. Chapter 7: Using JDBC with Spring. 1) A Simpler Approach ) The JdbcTemplate. Class...

Programmierpraktikum

Transcription:

Seminář Java Kontejnery Radek Kočí Fakulta informačních technologií VUT Březen 2008 Radek Kočí Seminář Java Kontejnery 1/ 53

Téma přednášky Kontejnery For-each loop Autoboxing Radek Kočí Seminář Java Kontejnery 2/ 53

Příklad public class Car {... public int run(int km) {... public class Driver { protected String name; protected Car drivercar; public void drivecar(car c) { drivecar = c; drivecar.drivenby(this); Radek Kočí Seminář Java Kontejnery 3/ 53

Příklad Radek Kočí Seminář Java Kontejnery 4/ 53

Příklad Radek Kočí Seminář Java Kontejnery 5/ 53

Kontejnery Kontejnery (containers) v Javě slouží k ukládání objektů (ne hodnot primitivních typů!) verze < 5.0 kontejnery jsou koncipovány jako beztypové verze => 5.0 kontejnery nesou typovou informaci o prvcích Většinou se používají kontejnery hotové, vestavěné (součást Java Core API): vestavěné kontejnerové třídy jsou definovány v balíku java.util je možné vytvořit si vlastní implementace, obvykle ale zachovávající/implementující standardní rozhraní Radek Kočí Seminář Java Kontejnery 6/ 53

Kontejnery K čemu slouží? jsou dynamickými alternativami k poli a mají daleko širší použití k uchování proměnného počtu objektů počet prvků se v průběhu existence kontejneru může měnit oproti polím nabízejí časově efektivnější algoritmy přístupu k prvkům Radek Kočí Seminář Java Kontejnery 7/ 53

Kontejnery Základní kategorie kontejnerů seznam (List) lineární struktura množina (Set) struktura bez uspořádání, rychlé dotazování na přítomnost prvku asociativní pole, mapa (Map) struktura uchovávající dvojice klíč hodnota, rychlý přístup přes klíč Radek Kočí Seminář Java Kontejnery 8/ 53

Kontejnery Kontejnery rozhraní, nepovinné metody Funkcionalita vestavěných kontejnerů je obvykle předepsána výhradně rozhraním, které implementují. Rozhraní však připouštějí, že některé metody jsou nepovinné, třídy jej nemusí implementovat (optional operations)! V praxi se totiž někdy nehodí implementovat jak čtecí, tak i zápisové operace některé kontejnery jsou read-only Radek Kočí Seminář Java Kontejnery 9/ 53

Kontejnery rozhraní Radek Kočí Seminář Java Kontejnery 10/ 53

Kontejnery implementace rozhraní hash table resizable balanced linked list array tree Set HashSet TreeSet List ArrayList LinkedList Map HashMap TreeMap SortedSet SortedMap Uvedené kontejnery implementují všechny optional operace povolují null elementy (klíče, hodnoty) jsou nesynchronizované Radek Kočí Seminář Java Kontejnery 11/ 53

Kontejnery souběžný přístup, výjimky Moderní kontejnery jsou nesynchronizované, nepřipouštějí souběžný přístup z více vláken. Standardní, nesynchronizovaný, kontejner lze však zabalit synchronizovanou obálkou. Při práci s kontejnery může vzniknout řada výjimek, např. IllegalStateException apod. Většina má charakter výjimek běhových, není povinností je odchytávat pokud věříme, že nevzniknou. Radek Kočí Seminář Java Kontejnery 12/ 53

Kolekce Kolekce jsou kontejnery implementující rozhraní Collection (viz API doc k rozhr. Collection) Rozhraní kolekce popisuje velmi obecný kontejner, disponující operacemi: přidávání, rušení prvku, získání iterátoru, zjišťování prázdnosti atd. Mezi kolekce patří mimo Map všechny ostatní vestavěné kontejnery List, Set Prvky kolekce nemusí mít svou pozici danou indexem viz např. Set Radek Kočí Seminář Java Kontejnery 13/ 53

Kontejnery Java 1.4.2 public interface List extends Collection {... public boolean add(object o); public Object get(int index); při vybírání elementu z kolekce musíme přetypovat není hlídáno kompilátorem pouze dynamická typová kontrola šance na vygenerování run-time výjimky Radek Kočí Seminář Java Kontejnery 14/ 53

Kontejnery Java 5.0 Generics (vlastnost Java 5.0) public interface List<E> extends Collection<E> {... public boolean add(e o); public E get(int index); umožňuje komunikaci s kompilátorem statická kontrola typů při manipulaci s kontejnery bez přetypování! Radek Kočí Seminář Java Kontejnery 15/ 53

Iterátory Iterátory jsou prostředkem, jak chodit po prvcích kolekce buďto v neurčeném pořadí nebo v uspořádání (u uspořádaných kolekcí) Každý iterátor musí implementovat velmi jednoduché rozhraní Iterator se třemi metodami: boolean hasnext() Object next() (resp. E next()) void remove() Radek Kočí Seminář Java Kontejnery 16/ 53

Seznamy Seznamy lineární struktury implementují rozhraní List prvky lze adresovat indexem (typu int) poskytují možnost získat dopředný i zpětný iterátor lze pracovat i s podseznamy Standardní implementace ArrayList LinkedList Radek Kočí Seminář Java Kontejnery 17/ 53

Seznamy Příklad public class Run { protected Driver driver; protected Car car; protected int km;... public class Car { protected List runs = new ArrayList();... public int run(driver d, int km) { runs.add(new Run(d, this, km)); Radek Kočí Seminář Java Kontejnery 18/ 53

Seznamy Příklad public class Car { protected List runs = new ArrayList();... public int run(driver d, int km) { runs.add(new Run(d, this, km)); public iterate() { for (Iterator i = seznam.iterator(); i.hasnext(); ) { Run r = (Run)i.next(); r.getdriver();... Radek Kočí Seminář Java Kontejnery 19/ 53

Seznamy příklad (Generics 5.0) Při překladu předchozího kódu: Note: ListDemo2.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. javac -Xlint:unchecked ListDemo2.java ListDemo2.java:9: warning: [unchecked] unchecked call to add(e) as a member of the raw type java.util.list seznam.add(new Run(d, this, km));... Radek Kočí Seminář Java Kontejnery 20/ 53

Seznamy Příklad (Generics 5.0) public class Car { protected List<Run> runs = new ArrayList<Run>();... public int run(driver d, int km) { runs.add(new Run(d, this, km)); public iterate() { for (Iterator<Run> i = seznam.iterator(); i.hasnext(); ) { Run r = i.next(); r.getdriver();... Radek Kočí Seminář Java Kontejnery 21/ 53

Seznamy Příklad (Generics 5.0) public class Car { protected List<Run> runs = new ArrayList<Run>();... public int run(driver d, int km) { runs.add(new Run(d, this, km)); public iterate() { ListIterator<Run> it = seznam.listiterator(1); Run r; r = it.previous(); r = it.next();... Radek Kočí Seminář Java Kontejnery 22/ 53

The For-Each Loop (Java 5.0) void cancelall(collection<timertask> c) { for (Iterator<TimerTask> i = c.iterator(); i.hasnext(); ) { TimerTask t = i.next(); t.cancel(); for (TimerTask t : c ) { t.cancel(); Radek Kočí Seminář Java Kontejnery 23/ 53

The For-Each Loop (Java 5.0) List suits, ranks =...; List sorteddeck = new ArrayList(); // BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasnext(); ) for (Iterator j = ranks.iterator(); j.hasnext(); ) sorteddeck.add(new Card(i.next(), j.next())); // Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasnext(); ) { Suit suit = (Suit) i.next(); for (Iterator j = ranks.iterator(); j.hasnext(); ) sorteddeck.add(new Card(suit, j.next())); Radek Kočí Seminář Java Kontejnery 24/ 53

The For-Each Loop (Java 5.0) List suits =...; List ranks =...; List sorteddeck = new ArrayList(); for (Suit suit : suits) for (Rank rank : ranks) sorteddeck.add(new Card(suit, rank)); Radek Kočí Seminář Java Kontejnery 25/ 53

Množiny Množiny struktury standardně bez uspořádání prvků (uspořádané viz dále) implementují rozhraní Set (což je rozšíření Collection) Cílem množin je mít možnost rychle (se složitostí O(log(n))) provádět atomické operace: vkládání prvku (add) odebírání prvku (remove) dotaz na přítomnost prvku (contains) lze testovat i relaci je podmnožinou Standardní implementace HashSet hašovací tabulka TreeSet vyhledávací strom Radek Kočí Seminář Java Kontejnery 26/ 53

Množiny příklad Set<Driver> mnozina = new HashSet<Driver>(); Driver d1 = new Driver("Pepa"); Driver d2 = new Driver("Franta"); mnozina.add(d1); mnozina.add(d2); System.out.println("Je v mnozine Franta?" + mnozina.contains(d2)); Radek Kočí Seminář Java Kontejnery 27/ 53

Množiny (equals a hashcode) Set<Driver> mnozina = new HashSet<Driver>(); Driver d1 = new Driver("Pepa"); Driver d2 = new Driver("Franta"); mnozina.add(d1); mnozina.add(d2); Driver d3 = new Driver("Franta"); System.out.println("Je v mnozine Franta?" + mnozina.contains(d3)); Radek Kočí Seminář Java Kontejnery 28/ 53

Množiny (equals a hashcode) class Driver { String name;... public boolean equals(object o) { if (o instanceof Driver) { Driver d = (Driver) o; return name.equals(d.name); else throw new IllegalArgumentException("..."); public int hashcode() { return name.hashcode(); Radek Kočí Seminář Java Kontejnery 29/ 53

Uspořádané množiny Uspořádané množiny Implementují rozhraní SortedSet (viz API doc k rozhraní SortedSet) Jednotlivé prvky lze tedy iterátorem procházet v přesně definovaném pořadí (uspořádání) podle hodnot prvků. Standardní implementace TreeSet vyhledávací Red-Black Trees Radek Kočí Seminář Java Kontejnery 30/ 53

Uspořádané množiny příklad SortedSet<Driver> mnozina = new TreeSet<Driver>(); Driver d1 = new Driver("Pepa"); Driver d2 = new Driver("Franta"); mnozina.add(d2); mnozina.add(d1); for (Driver d : mnozina) { d.getname(); Run-time vyjimka java.lang.classcastexception Radek Kočí Seminář Java Kontejnery 31/ 53

Uspořádané množiny komparátor Uspořádání je dáno: standardním chováním metody compareto vkládaných objektů pokud implementují rozhraní Comparable nebo je možné uspořádání definovat pomocí tzv. komparátoru (objektu impl. rozhraní Comparator) při vytvoření množiny. Radek Kočí Seminář Java Kontejnery 32/ 53

Uspořádané množiny komparátor (příklad) Implementace operace compareto public class Driver implements Comparable { String name;... public int compareto(object o) { if (o instanceof Driver) { Driver c = (Driver) o; return name.compareto(name); else throw new IllegalArgumentException("..."); Radek Kočí Seminář Java Kontejnery 33/ 53

Mapy Mapy (asociativní pole, nepřesně také hašovací tabulky nebo haše) fungují na stejných principech a požadavcích jako Set: avšak ukládají dvojice (klíč hodnota) a umožnují rychlé vyhledání dvojice podle hodnoty klíče, základními metodami jsou: dotazy na přítomnost klíče v mapě (containskey), výběr hodnoty odpovídající zadanému klíči (get), možnost získat zvlášt množiny klíčů, hodnot nebo dvojic (klíč hodnota) Radek Kočí Seminář Java Kontejnery 34/ 53

Mapy Mapy mají: podobné implementace jako množiny (tj. hašovací tabulky nebo stromy) logaritmickou složitost základních operací put remove containskey Standardní implementace HashMap TreeMap Radek Kočí Seminář Java Kontejnery 35/ 53

Mapy příklad Map<String, Driver> mapa = new HashMap<String, Driver>(); Driver d1 = new Driver("Pepa"); Driver d2 = new Driver("Franta"); mapa.put(d1.getname(), d1); mapa.put(d2.getname(), d2); Driver d = mapa.get("pepa"); for (String name : mapa.keyset()) { mapa.get(name); Radek Kočí Seminář Java Kontejnery 36/ 53

Uspořádané mapy Uspořádané mapy Implementují rozhraní SortedMap Dvojice (klíč hodnota) jsou v nich uspořádané podle hodnot klíče. Uspořádání lze ovlivnit naprosto stejným postupem jako u uspořádané množiny. Standardní implementace TreeMap implementace Red-Black Trees Radek Kočí Seminář Java Kontejnery 37/ 53

Uspořádané mapy příklad SortedMap<String, Driver> mapa = new TreeMap<String, Driver>(); Driver d1 = new Driver("Pepa"); Driver d2 = new Driver("Franta"); mapa.put(d1.getname(), d1); mapa.put(d2.getname(), d2); for (String name : mapa.keyset()) { Driver d = mapa.get(name); Radek Kočí Seminář Java Kontejnery 38/ 53

Uspořádané mapy příklad Exception in thread "main" java.lang.classcastexception:... at java.util.treemap.compare(treemap.java:1093) at java.util.treemap.put(treemap.java:465) at seminar6.sortedmapdemo.main(sortedmapdemo.java Radek Kočí Seminář Java Kontejnery 39/ 53

Uspořádané mapy příklad s komparátorem SortedMap<Driver, Car> mapa = new TreeMap<Driver, Car>(new DComp()); Driver d1 = new Driver("Pepa"); Car c1 = new Car(); Driver d2 = new Driver("Franta"); Car c2 = new Car(); mapa.put(d1, c1); mapa.put(d2, c2); for (Driver d : mapa.keyset()) { Car c = mapa.get(d); // d ridi c Radek Kočí Seminář Java Kontejnery 40/ 53

Uspořádané mapy příklad s komparátorem class DComp implements Comparator { public int compare(object o1, Object o2) { // porovnava jen podle jmena if (o1 instanceof Driver && o2 instanceof Driver) { Driver c1 = (Driver)o1; Driver c2 = (Driver)o2; return c1.name.compareto(c2.name); else throw new IllegalArgumentException(".."); Radek Kočí Seminář Java Kontejnery 41/ 53

Srovnání implementací kontejnerů Seznamy na bázi pole (ArrayList) rychlý přímý přístup (přes index) na bázi lineárního zřetězeného seznamu (LinkedList) rychlý sekvenční přístup (přes iterátor) téměř vždy se používá ArrayList stejně rychlý a paměťově efektivnější Radek Kočí Seminář Java Kontejnery 42/ 53

Srovnání implementací kontejnerů Množiny a mapy na bázi hašovacích tabulek (HashMap, HashSet) rychlejší, ale neuspořádané (lze získat iterátor procházející klíče uspořádaně) na bázi vyhledávacích stromů (TreeMap, TreeSet) pomalejší, ale uspořádané spojení výhod obou LinkedHashSet, LinkedHashMap (novinka v Javě 2, v1.4) Radek Kočí Seminář Java Kontejnery 43/ 53

Historie Existují tyto starší typy kontejnerů ( náhrada) Hashtable HashMap, HashSet (podle účelu) Vector List Stack List Roli iterátoru plnil dříve výčet (enumeration) se dvěma metodami: boolean hasmoreelements() Object nextelement() Radek Kočí Seminář Java Kontejnery 44/ 53

Nemodifikovatelné kolekce Statické metody třídy Collections XXX unmodifiablexxx(xxx c); Set unmodifiableset(set c); Map unmodifiablemap(map c);... Radek Kočí Seminář Java Kontejnery 45/ 53

Nemodifikovatelné kolekce public class UnmodifiableDemo { public static void main(string[] args) { List seznam = new ArrayList(); seznam.add(new Integer(20)); seznam = Collections.unmodifiableList(seznam); System.out.println(seznam); seznam.add(new Integer(20)); Vyjimka UnsupportedOperationException Radek Kočí Seminář Java Kontejnery 46/ 53

Synchronizované kolekce Statické metody třídy Collections XXX synchronizedxxx(xxx c); Collection synchronizedset(collection c); Map synchronizedmap(map c);... Příště... Radek Kočí Seminář Java Kontejnery 47/ 53

The For-Each Loop (Java 5.0) // Returns the sum of the elements of a int sum(int[] a) { int result = 0; for (int i : a) result += i; return result; Radek Kočí Seminář Java Kontejnery 48/ 53

Objektová verze primitivních datových typů int Integer long Long short Short byte Byte char Character float Float double Double boolean Boolean void Void Double.MAX VALUE float f = Float.parseFloat(řetězec) Radek Kočí Seminář Java Kontejnery 49/ 53

Autoboxing (Java 5.0) // Prints a frequency table of the words // on the command line public class Frequency { public static void main(string[] args) { Map<String, Integer> m = new HashMap<String, Integer>(); for (String word : args) { Integer freq = m.get(word); m.put(word, (freq == null? new Integer(1) : new Integer(freq.intValue() + 1) )); System.out.println(m); Radek Kočí Seminář Java Kontejnery 50/ 53

Autoboxing (Java 5.0) public class Frequency { public static void main(string[] args) { Map<String, Integer> m = new HashMap<String, Integer>(); for (String word : args) { Integer freq = m.get(word); m.put(word, (freq == null? 1 : freq+1)); System.out.println(m); Radek Kočí Seminář Java Kontejnery 51/ 53

Autoboxing (Java 5.0) java Frequency if it is to be it is up to me to do {be=1, do=1, if=1, is=2, it=2, me=1, to=3, up=1 Radek Kočí Seminář Java Kontejnery 52/ 53

Odkazy Podrobné seznámení s kontejnery http://java.sun.com/docs/books/ tutorial/collections/ Popis Java 5.0 http://java.sun.com/j2se/1.5.0/docs/index.html Radek Kočí Seminář Java Kontejnery 53/ 53