BJUG_1: Typy Generyczne, Kolekcje

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Standardowa biblioteka języka C++
Klasy i obiekty.
Wzorce.
Generics w .NET 2.0 Łukasz Rzeszot.
Implementacja ekstensji klasy
Elementarne struktury danych Piotr Prokopowicz
Programowanie obiektowe w Javie
Wybrane elementy języka Java
Wybrane elementy języka Java – ciąg dalszy
Nowa wersja C# Autor: Piotr Sobczak
Licznik template<class Count_Type> class Count { public:
Serwery Aplikacji ASP .NET Web Objects Arkadiusz Popa.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Tablice jednowymiarowe 1
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Język Java Wielowątkowość.
Techniki i języki programowania
Podstawy C# Grupa .NET PO.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Podstawy inżynierii oprogramowania Zofia Kruczkiewicz
PIO 3_2, Zofia Kruczkiewicz1 Wykład 3 – część druga Iteracyjno-rozwojowy cykl oprogramowania 3.
Programowanie obiektowe III rok EiT
Programowanie obiektowe – zastosowanie języka Java SE
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Seminarium problemowe
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
PIO 2_2, Zofia Kruczkiewicz1 Wykład 2 – część druga Iteracyjno-rozwojowy cykl oprogramowania 2.
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Programowanie obiektowe 2013/2014
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Kurs języka C++ – wykład 4 ( )
Klasy kolekcji Tomasz Wilczyński. Kolekcja Schemat kolekcji Javy zawiera sześć interfejsów oraz kilka innych implementacji tych interfejsów do celów ogólnych.
Paweł Starzyk Obiektowe metody projektowania systemów
Łukasz Bieszczad Mateusz Gałązka Karol Włodarek
Programowanie Zaawansowane
Zestaw pytań nr. 3 Typy generyczne Wyjątki OPRACOWALI: JAKUB GRYCZEWSKIKINGA ROSA DANIEL KAPTEJNYWOJCIECH ŁĘCZYCKI
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
Kolekcje (3) Zbiory. Porównywanie i porządkowanie elementów kolekcji. (c) Krzysztof Barteczko 2014.
Kolekcje (4) Mapy Widoki i algorytmy (c) Krzysztof Barteczko 2014.
Typy i metody sparametryzowane (generics) (c) Krzysztof Barteczko 2014.
1 Kolekcje i tablice © Krzysztof Barteczko, PJWSTK 2009.
Implementacja asocjacji (z atrybutami i bez) przy użyciu: referencji (kolekcji referencji) tablic asocjacyjnych przygotował: Kamil Kowalczyk.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Wprowadzenie do języka Java Kolekcje w języku Java Bartosz Walter.
Programowanie Obiektowe – Wykład 6
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Typy wyliczeniowe, kolekcje
Programowanie Obiektowe – Wykład 5
Wątki, programowanie współbieżne
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie obiektowe II
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
PGO Interfejsy Michail Mokkas.
PGO Kolekcje Michail Mokkas.
PGO Dziedziczenie Michail Mokkas.
PGO Porównywanie obiektów
Zapis prezentacji:

BJUG_1: Typy Generyczne, Kolekcje Wszystko co warto wiedzieć… w pracy i na rozmowie kwalifikacyjnej

Agenda Typy Generyczne Kolekcje Czym są Typy Generyczne i dlaczego warto ich używać Zastosowanie Typów Generycznych WildCards – opis wykorzystania słów kluczowych extends\super przy deklaracji typów generycznych Procesu wymazywania typów - jak działa kompilator w Javie Implemenacja Pary przy wykorzystaniu Typów Generycznych Kolekcje Wstęp do JCF …Hash, hashCode Struktura frameworka Opis najważniejszych klas i funkcjonalności Collection VS Collections

Typy Generyczne - Wprowadzenie Koncept programowania generycznego został nakreślony w 1988 roku przez Davida Mussera (programista C++) i Alexandra Stepanova (C++ designer) : “Generic programming is about abstracting and classifying algorithms and data structures. […] Its goal is the incremental construction of systematic catalogs of useful, efficient and abstract algorithms and data structures.”

Typy Generyczne - Czym są Typy Generyczne i dlaczego warto ich używać Java jest językiem ściśle typowanym – do referencji o danym typie możemy przypisać jedynie obiekty tego typu, bądź typów pochodnych Generyki dostarczają dodatkową warstwę abstrakcji ponad standardowymi Typami Klasy, Interfejsy oraz Metody mogą być sparametryzowane przez dowolny typ Posłużmy się przykładem ArrayList’y: public class ArrayList<E> ... Podczas inicjalizacji obiektu ArrayList za <E> należy podstawić dowolony, konkretny typ List<String> list = new ArrayList<String>(); ( < 1.7) List<String> list = new ArrayList<>(); (1.7) Dodatkowo, wykorzystanie Typów Generycznych podnosi czytelność kodu oraz ułatwia proces inżynierii wstecznej (gdy już przywyknie się do składni ) Umożliwia pisanie generycznych algorytmów 1.5 = 2004

Typy Generyczne – Największa zaleta Problem: Istnieje niesparametryzowana Kolekcja obiektów Kompilator nie jest w stanie odgadnąć typu obiektów Programista podczas pobierania obiektów z Kolekcji zmuszony jest dokonywać castowania Wyjątek ClassCastException może zostać zgłoszony w trakcie pracy programu (runtime exception) Rozwiązanie: wykorzystanie Typów Generycznych Określą typ obiektów w Kolekcji Kompilator dokona castowania Przykład: Kompilator sprawdzi czy programista nie próbuje dodać Integer’a do listy String’ów i zgłosi ewentualny błąd w czasie kompilacji

Typy Generyczne - Wildcards Przypuśćmy, że chcemy napisać metodę która wypisze wszystkie elementy z Kolekcji, przykładowy kod w wersjach Javy < 1.5 mógłby wyglądać: public static void printCollection(Collection collection) { Iterator iterator = collection.iterator(); for (int i = 0; i < collection.size(); i++) { System.out.println(iterator.next()); }

Typy Generyczne - Wildcards Zastosowanie Typów Generycznych – podejście pierwsze public static void printCollection(Collection<Object> collection) { for (Object o : collection) { System.out.println(o); } Wykorzystanie metody: public static void main(String[] args) { Collection<String> cs = new Vector<String>(); printCollection(cs); // Błąd kompilacji List<Integer> li = new ArrayList<Integer>(10); printCollection(li); // Błąd kompilacji

Typy Generyczne - Wildcards Zastosowanie Typów Generycznych – podejście drugie public static void printCollection(Collection<? extends Object> c) { for (Object o : c) { System.out.println(o); // Brak błędu, ale zabronione jest dodawanie obiektów } Wykorzystanie metody: public static void main(String[] args) { Collection<String> cs = new Vector<String>(); printCollection(cs); // Brak błędu List<Integer> li = new ArrayList<Integer>(10); printCollection(li); // Brak błędu Co zrobić w przypadku gdy zależy nam na dodawaniu obiektów do Kolekcji?: public static void printCollection(Collection<? super Integer> c)

Typy Generyczne – Wymazywanie typów Typy Generyczne wykorzystują proces wymazywania Parametry typów są usuwane z klas w procesie kompilacji Proces ten został wymuszony przez chęć zachowania wstecznej kompatybilności z wersjami Javy < 1.5 Po usunięciu zapisu generycznego na jego miejsce kompilator wstawia castowanie

Typy Generyczne – Wymazywanie typów class Pi { double pi; @GoRMI Object getPi() { return field; } @Override public String toString(){ return „” + pi; Parser Annotation Checker Plugins Class File Writer Type Error Source File Program with annotations

Typy Generyczne – Przykład zastosowania public class Pair<A, B> { private A elementA; private B elementB; public Pair(A elementA, B elementB) { this.elementA = elementA; this.elementB = elementB; } public A getElementA() { return elementA; public void setElementA(A elementA) { public B getElementB() { return elementB; public void setElementB(B elementB) {

Typy Generyczne – Kiedy używać? Wtedy gdy potrzebujemy zapewnić bezpieczeństwo na operacjach typów i uniknąć castowania – czyli zawsze Podczas implementacji generycznych algorytmów, klas typu Utilities

Kolekcje – Wstęp do JCF API Javy dostarcza gotowe implementacje najczęściej używanych w programowaniu struktur danych Struktury te w nomenklaturze Javy nazywamy Kolekcjami Rozumiemy je zaś jako Obiekty przechowywujące inne Obiekty Java Collections Framework pozwala więc reprezentować i manipulować w różnorodny sposób grupami obiektów Framework składa się z Interfejsów oraz implementujących je Klas

Kolekcje – …Hash, hashCode, equals Znajomość działania metod equals oraz hashCode jest potrzebna do zrozumienia dziania niektórych kolekcji W Javie metody equals oraz hashCode dziedziczone są z klasy object Sygnatury metod to: public boolean equals(Object obj) public int hashCode() Metoda equals sprawdza czy obiekty są takie same (co sprawdza == ?) – odpowiedź na pytanie czy obiekty są takie same należy do implementującego metodę Dodatkowo aby poprawnie zaimplementować equals , należy przestrzegać kontraktu. Jego warunki mowią że relacja wyznaczona metodą equals musi być: Zwrotna Symetryczna Przechodnia Wywołanie metody equals z argumentem null musi zwrócić false

Kolekcje – …Hash, hashCode, equals Kontrakt metody hashCode: Każdorazowe uruchomienie metody hashCode na danych obiektach musi zwracać te same wartości Jeśli dwa obiekty są takie same (equals zwraca true), muszą mieć taką samą wartość zwracaną przez metodę hashCode Equals i hashCode w kolekcjach:

Kolekcje – Interfejsy Set SortedSet Iterable Collection NavigableSet Queue List Deque Map SortedMap Dlaczego mapy nie implementują kolekcji? NavigableMap

Kolekcje – Mapy – Metody void clear() boolean containsKey(Object key) Set<Map.Entry<K,V>> entrySet() V get(Object key) V put(K key, V value) V remove(Object key) int size() Set<K> keySet() Map SortedMap NavigableMap K firstKey() K lastKey() SortedMap<K,V> headMap(K toKey) SortedMap<K,V> tailMap(K fromKey) SortedMap<K,V> subMap(K fromKey, K toKey)

Kolekcje – Interfejsy Set SortedSet Iterable Collection NavigableSet Iterator<T> iterator() boolean add(E e) boolean remove(Object o) Object[] toArray() Set SortedSet Iterable Collection NavigableSet Queue List Deque Dlaczego mapy nie implementują kolekcji?

Kolekcje – Interfejsy Set SortedSet Iterable Collection NavigableSet Queue List Deque Dlaczego mapy nie implementują kolekcji? void add(int index, E element) List<E> subList(int fromIndex, int toIndex)

Kolekcje – Interfejsy Set SortedSet Iterable Collection NavigableSet Queue List Deque E ceiling(E e) E floor(E e) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> headSet(E toElement, boolean inclusive) E first() E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) SortedSet<E> tailSet(E fromElement)

Kolekcje – Interfejsy Set SortedSet Iterable Collection NavigableSet Queue List Deque boolean offer(E e) E poll() E peek() E getFirst() E getLast() E peekFirst() E peekLast()

Kolekcje - ArrayList Tablica o zmiennym rozmiarze, ulegająca automatycznemu powiększeniu lub zmniejszeniu podczas dodawania i usuwania obiektów Wewnątrz klasy rolę kontenera na obiekty pełni tablica obiektów ArrayList’a zastąpiła klasę Vector – różnica – metody klasy Vector są zsynchronizawane Można dodawać null

Kolekcje – ArrayList – podstawowe operacje //inicjalizacja List<String> stringList = new ArrayList<String>(); //dodawanie elementów stringList.add("Element One"); stringList.add(null); //pobieranie elementów String a = stringList.get(0); //usuwanie stringList.remove(0); //iteracja pętlą for each for (String s : stringList) { System.out.println(s); }

Kolekcje – ArrayList VS LinkedList LinkedList jest kolejną implementacją interfejsu List, opartą o dostęp wiązany (previous, next) ArrayList LinkedList szybszy dostęp do poszczególnych elementów (indeksy) szybsze operacje dodawania i usuwania Aby dodać element wykonywana jest operacja tworzenia nowej tablicy Aby dodać element wystarczy odpowiednio ustawić referencje

Kolekcje – HashSet, TreeSet Klasy obiektów umieszczanych w HashSet’cie muszą implementować metody equals oraz hashCode Dostęp do obiektów przyśpieszony dzięki funkcji haszującej Obiekty w HashSet’cie są unikalne – duplikaty nie będą dodawane do kolekcji Może przyjąć null’a Obiekty w omawianej kolekcji nie są indeksowane, niemożliwy więc jest dostęp numeryczny Obiekty dodawane do TreeSet’u muszą implementować Comparable\Comparator Obiekty w TreeSet’cie są sortowane (porządek naturalny - Comparable)

Kolekcje – HashSet, TreeSet – podstawowe operacje //inicjalizacja Set<String> stringSet = new HashSet<String>(); //dodawanie elementów String element = "Element One"; stringSet.add(element); stringSet.add(null); //sprawdzanie zawierania obiektów boolean isElement = stringSet.contains(element); //usuwanie stringSet.remove(element); //iteracja pętlą for each for (String s : stringSet) { System.out.println(s); }

Kolekcje – HashMap, TreeMap Służą przechowywaniu obiektów w parach klucz – wartość Analogicznie jak w przypadku HashSet’u obiekty dodawane do HashMap’y jako klucze muszą mieć poprawnie zaimplementowane metody equals oraz hashCode Dostęp do obiektów przechowywanych kolekcji uzyskuje się poprzez wartość klucza Klucz musi pozostać unikalny dla obiektu kolekcji Dozwolone jest dodawanie null’a jako klucz oraz wartość Klasy obiektów dodawanych do TreeMap’y muszą implementować Comparable lub Comparator Obiekty w TreeMap’ie posortowane są po kluczach (porządek naturalny - Comparable)

Kolekcje – HashMap, TreeMap – podstawowe operacje //inicjalizacja Map<Integer, String> map = new HashMap<Integer, String>(); //dodawanie elementów map.put(1, "One"); map.put(null, null); //pobieranie elementów String value = map.get(1); //usuwanie String removedvalue = map.remove(1); //iteracja pętlą for each for (Integer i : map.keySet()) { System.out.println(map.get(i)); } Java 1.7 możliwa jest szybsza inicjalizacja

Kolekcje – PriorityQueue Elementy dodawane do PriorityQueue są sortowane w porządku naturalnym Nie można dodać null’a Pierwszym elementem w kolejce jest zawsze „najmniejszy” obiekt zgodnie z przyjętym porządkiem sortowania Dozwolone dodawanie obiektów o tej samej wartości Metoda poll zwraca i usuwa pierwszy obiekt w kolejce Metoda peek zwraca lecz nie usuwa pierwszy obiekt w kolejce Jeśli kolejka jest pusta zostanie zwrócony null Do dodawania obiektów do kolejki służy metoda offer

Kolekcje – PriorityQueue – podstawowe operacje PriorityQueue<Integer> a = new PriorityQueue<>(); // inicjalizacja PriorityQueue<Integer> queue = new PriorityQueue<>(); // dodawanie elementów queue.offer(1); queue.offer(2); // pobieranie pierwszego elementu bez usuwania int peek = queue.peek(); // pobieranie pierwszego elementu z usuwaniem int poll = queue.poll(); // iteracja pętlą for each for (Integer i : queue) { System.out.println(i); }

Kolekcje – Collection VS Collections Poza Kolekcjami Java udostępnia także klasę Collections, która jest zbiorem statycznych metod zawierających implementacje najczęściej wykorzystywanych operacji algorytmicznych Najważniejsze z metod dostępnych w klasie Collections to: public static <T extends Comparable<? super T>> void sort(List<T> list) public static <T> void sort(List<T> list, Comparator<? super T> c) public static void reverse(List<?> list) public static <T extends Object & Comparable<? super T>> T min(Collection< ? extends T> coll) public static <T extends Object & Comparable<? super T>> T max(Collection< ? extends T> coll)

www.tt.com.pl