1 / 32

BJUG_1: Typy Generyczne, Kolekcje

BJUG_1: Typy Generyczne, Kolekcje. Wszystko co warto wiedzieć… w pracy i na rozmowie kwalifikacyjnej. Agenda. Typy Generyczne Czym są Typy Generyczne i dlaczego warto ich używać Zastosowanie Typów Generycznych

nitsa
Download Presentation

BJUG_1: Typy Generyczne, Kolekcje

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Agenda Typy Generyczne • 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

  3. 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.”

  4. 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: publicclassArrayList<E> ... • Podczas inicjalizacji obiektu ArrayList za <E> należy podstawić dowolony, konkretny typ • List<String> list = newArrayList<String>(); ( < 1.7) • List<String> list = newArrayList<>(); (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

  5. 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 (runtimeexception) 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

  6. 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ć: publicstaticvoidprintCollection(Collection collection) { Iterator iterator = collection.iterator(); for(inti = 0; i < collection.size(); i++) { System.out.println(iterator.next()); } }

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

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

  9. 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

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

  11. Typy Generyczne – Przykład zastosowania publicclass Pair<A, B> { privateA elementA; private B elementB; public Pair(A elementA, B elementB) { this.elementA= elementA; this.elementB= elementB; } public A getElementA() { returnelementA; } publicvoidsetElementA(A elementA) { this.elementA= elementA; } public B getElementB() { returnelementB; } publicvoidsetElementB(B elementB) { this.elementB= elementB; } }

  12. 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

  13. 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

  14. 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: • publicbooleanequals(Object obj) • publicinthashCode() 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 nullmusi zwrócić false

  15. Kolekcje – …Hash, hashCode, equals • Kontrakt metody hashCode: • Każdorazowe uruchomienie metody hashCodena 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:

  16. Kolekcje – Interfejsy Iterable Map Collection SortedMap List Set Queue NavigableMap Deque SortedSet NavigableSet

  17. Kolekcje – Mapy – Metody • voidclear() • booleancontainsKey(Object key) • Set<Map.Entry<K,V>> entrySet() • V get(Object key) • V put(K key, V value) • V remove(Object key) • intsize() • Set<K> keySet() • K firstKey() • K lastKey() Map SortedMap NavigableMap • SortedMap<K,V> headMap(KtoKey) • SortedMap<K,V> tailMap(KfromKey) • SortedMap<K,V> subMap(K fromKey, K toKey)

  18. Kolekcje – Interfejsy booleanadd(E e) booleanremove(Object o) Object[] toArray() Iterator<T> iterator() Iterable Collection List Set Queue Deque SortedSet NavigableSet

  19. Kolekcje – Interfejsy void add(intindex, E element) List<E> subList(intfromIndex, inttoIndex) Iterable Collection List Set Queue Deque SortedSet NavigableSet

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

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

  22. 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

  23. Kolekcje – ArrayList – podstawowe operacje //inicjalizacja List<String> stringList = newArrayList<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); }

  24. Kolekcje – ArrayListVS LinkedList LinkedList jest kolejną implementacją interfejsu List, opartą o dostęp wiązany (previous, next)

  25. 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)

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

  27. 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)

  28. Kolekcje –HashMap, TreeMap– podstawowe operacje //inicjalizacja Map<Integer, String> map = newHashMap<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)); }

  29. 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

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

  31. 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: • publicstatic <T extendsComparable<? super T>> void sort(List<T> list) • publicstatic <T> void sort(List<T> list, Comparator<?super T> c) • publicstaticvoid reverse(List<?> list) • publicstatic <T extendsObject & Comparable<? super T>> T min(Collection<? extends T> coll) • publicstatic <T extendsObject & Comparable<? super T>> T max(Collection<? extends T> coll)

  32. www.tt.com.pl

More Related