Sammansatta datatyper Generics: Parametrisk polymorfism

Relevanta dokument
Sammansatta datatyper Generics: Parametrisk polymorfism

Sammansatta datatyper Generics: Parametrisk polymorfism

Samlingar av objekt + Generics (parametrisk polymorfism)

TDDD78 Objektorientering i Java, del 2

DAT043 - föreläsning 8

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Föreläsning 4 Innehåll

Arrayer. results

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Arrayer (fält)

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Länkade strukturer, parametriserade typer och undantag

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Classes och Interfaces, Objects och References, Initialization

TDDD78 Viktiga begrepp, del 2

Övningen vill visa på vikten av valet av datastruktur, trots att de ofta erbjuder samma funktionalitet genom sina gränssnitt.

Variabler, värden och typer

Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Variabler, värden och typer

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorientering: Lagring, räckvidd och livstid

TDDD78, TDDE30, 729A Typhierarkier del 3 När och hur vill vi använda dem? Några Best Practices

Länkade strukturer. (del 2)

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Stackar, köer, iteratorer och paket

TDDD78 Objektorientering i Java, del 3. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad programmering med Java, Generics

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Objektorientering: Lagring och livstid

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det).

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Föreläsning 2 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 10. ADT:er och datastrukturer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

TDDD78 Objektorientering: Lagring och livstid

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning REPETITION & EXTENTA

Samlingar Collection classes

OOP Objekt-orienterad programmering

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Den som bara har en hammare tror att alla problem är spikar

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration A Objektsamlingar

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 2. Länkad lista och iterator

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Generisk klass med typparameter Inre klass - ListIterator

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Objektorienterad Programkonstruktion

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Tentamen ID1004 Objektorienterad programmering October 29, 2013

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Introduktion till Java

Föreläsning 6: Introduktion av listor

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Objektorienterad programmering i Java

TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 2. Länkad lista och iterator

Föreläsning 2 Innehåll

Intro till standardbiblioteket. Eric Elfving

TDDC77 Objektorienterad Programmering

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Transkript:

jonas.kvarnstrom@liu.se 2017 Sammansatta datatyper Generics: Parametrisk polymorfism

Listor och arrayer 2 Enligt TDDD73: Många språk har både listor och arrayer även Java och Python! Exakta definitioner varierar Arrayer Oftast lägre nivå, mer maskinnära, mindre funktionalitet Lagras sekventiellt i minnet Vissa operationer mycket snabba Ofta grundläggande datatyp i språket, egen syntax Listor Fokus på funktionalitet / gränssnitt, många olika sätt att lagra dem Olika implementation olika egenskaper Python har listor som grundläggande datatyp

För varje typ finns en arraytyp Arrayer skapas med Storleken sätts när de skapas, ändras aldrig Element hämtas ut med index (första = 0) Tomma element skapas och initialiseras:,,, Index: Indexkontroll: Ger

Arrayer 2: Pekar-arrayer 5 Objektarrayer innehåller pekare: Element initialiseras till Inga nya -objekt skapas! Fungerar som alla pekare: Kan peka på vilken som helst, inklusive subklasser ( )

Arrayer 3: Ange innehåll 6 Man kan ange innehållet vid deklarationen: Antal element: Implicit

Arrayer 4: Flerdimensionella arrayer 7 Arrayer av arrayer: (data) (data)

Arrayer 5: Tillgängliga metoder 8 Arraytypen är subklass till, ärver metoder

Arrayer 6: Default-metoder 9 Av historiska anledningar: Bara default-implementationerna Default-implementationer Vad vi oftast vill Default-implementationer Vad vi oftast vill

Arrayer 7: Styrkor och svagheter 10 Styrka: Effektiv användning av minne Liten konstant "startkostnad", 12 20 bytes Plus elementens "verkliga" kostnad Array av 2 bytes/element Styrka: Snabbt Element 40: Minnesadress = Svaghet: Saknar viss funktionalitet kan t.ex. inte ändra längd! Saknar metoder som, Svaghet: Bara en variant med fixerade egenskaper Java har många olika sorters listor

Listor: Intro 12 Listor: Variabel storlek bekvämare att använda! Ingen speciell syntax, utan vanliga klasser För bättre förståelser för listor och generics: Vi visar möjliga implementationer Börja med ett gränssnitt

Arraylistor 1: Alternativ 13 Ett sätt att lagra listor: med arrayer Listan har men är inte en array Metoderna använder arrayen Alt. 1: Arraystorlek = listlängd Skapa tom lista Addera element Addera element Addera element Addera element Addera element Vid varje tillägg: Allokera array med ny längd Kopiera över gamla innehållet Lägg till det nya elementet Alt. 2: Allokera extra element Skapa tom lista Addera element Addera element Addera element Addera element Addera element Ha en reserv av tomma platser Fullt dubblera storleken Måste lagra antal använda platser!

Arraylistor 2: En listklass 14 Allokerar lite extra plats Hur många av platserna är använda?

Arraylistor 3: Addera element 15 "Hello" Men vad händer när arrayen blir full?

Arraylistor 4: Utöka utrymmet 16 Är interna lagringen full? Skapa större array, kopiera innehållet, kasta bort gamla arrayen!

Arraylistor 5: Hämta element 17 Kolla index: Tillåt inte get(4) när size==2!

Arraylistor 6: Stoppa in element 18 Effektiv representation för de flesta operationer, men A B C D E F G H A B C C D E F G H Kopiera tar tid! A B X C D E F G H Stoppa in

Länkade listor 1: Principen 19 Principen bakom länkade listor: En extra listnod per element använder mer minne

Länkade listor 2 20 Snabbt att skjuta in / ta bort värden

Länkade listor 3 21 Tar lång tid att ta fram värde nummer n i listan

Använda arrayer eller listor? 22 Arrayer används: För att implementera datatyper ArrayList måste använda en primitiv array När varje nanosekund spelar roll Bara efter CPU-profilering som visar att listhantering spelar roll Nästan alltid! Många hjälpfunktioner tillgängliga Kan lätt lägga till och ta bort element, osv Används av många klasser i Javas klassbibliotek Listor används: När varje byte spelar roll Bara efter minnesprofilering Ibland om storleken är fixerad Om storleken varierar: Låt listorna hantera detta! Tetrislabben använder arrayer eftersom Board-storleken är fixerad!

Elementtyper 1: Typspecifika listor? 24 Våra listklasser lagrar bara strängar! Behöver vi en listklass för varje elementtyp?

Elementtyper 2: Godtyckliga objekt 25 Array av Object-pekare, kan peka på objekt av godtycklig klass

Elementtyper 3: Problem 26 Nu får vi nya problem! : Ingen typsäkerhet när vi adderar element! Vill ha en lista där vi stoppar in strängar: Kan lägga in strängar: Kan råka lägga in cirklar också inget fel vid kompilering eller körning!

Elementtyper 4: Problem 27 Problem 2: Ingen typinformation när vi hämtar element! Vi måste tala om för kompilatorn: "Jag vet att jag la en sträng på position 0 jag lovar!" Krävs en cast extra arbete för oss

Elementtyper 5: Problem 28 Problem 3: Tänk om vi har fel! Upptäcks inte när programmet kompileras

Vanliga parametrar till metoder 30 är en heltalsvariabel Kan ha värdet 3, 4, 5, 8,

Typparametrar till klasser 31 E är en typvariabel Kan ha värdet String, Shape,

Generics 1: Intro 32 Generiska typer med typparametrar En array där elementen har typ E verkliga typen är inte angiven än Kan "instansieras" med olika typer som parameter

Generics 2: Användningsexempel 33 En lista där : En lista där en lista av listor!

Generics 3: Att skriva mindre 34 Mycket repetition: Syntaktiskt socker: Diamant-operatorn (betyder "samma som förut") DRY-principen: Don t RepeatYourself! Regelbrott är WET: Write Everything Twice

Generics 4: "Råa" typer 35 Man kan använda en generisk typ utan att ange typparametrar: Undvik enbart för kompatibilitet med gammal kod! Måste kunna kompilera kod skriven före 2004, när generics inte fanns

Parametrisk polymorfism 36 Kallas generisk programmering, ger oss parametrisk polymorfism Samma namn (MyList) Olika beteende (beroende på typparameter) Jämför med subtypspolymorfism Samma metodnamn, flera implementationer inom en typhierarki Olika implementation väljs dynamiskt, beroende på verklig objekttyp Jämför med ad-hoc-polymorfism (overloading) Samma metodnamn, flera implementationer i samma klass Olika implementation väljs statiskt, beroende på statiska parametertyper

Typparametrar och objekttyper 38 En typparameter måste ange en objekttyp! för egentligen skapas bara en klass! Kompilatorn tar hand om resten Sparar minne men List<int> då?

Wrappers 1: Intro 39 Hur skapar vi en listklass som accepterar heltal? Implementera om strukturerna? Använd wrappers! Repetera för 8 primitiva typer och för varje datastruktur Kan göras finns färdiga bibliotek på nätet (GNU Trove, ) Repetera för 8 primitiva typer klart

Wrappers 2: Jämförelse 40 Wrappers ger mindre andel overhead om strukturerna är mer komplexa

Wrappers 3: Wrapper-objekt 41 Det finns en wrapper-klass för varje primitiv datatyp Används bara om vi ska lagra i listor, objektpekare,! Använd int, double, boolean, i normalfallet: Returvärden, parametrar

Wrappers 4: Skapa 42 Kan skapas med vanlig konstruktor Bättre: Statiska fabriksmetoden Sparar tid och minne: Återanvänder objekt för vanliga värden! Integer-klassen har redan skapat objekt för heltalen -128 till +127 Alternativ: Autoboxing ( paketinslagning ) Kompilatorn: Vi behöver ett objekt men får ett heltal. Stoppa in Integer.valueOf()! (Potentiellt problem: Döljer komplexitet!)

Wrappers 5: Hämta värdet 43 För att hämta ut värdet: Anropa typevalue() Alternativ: Automatisk unboxing ( öppna paket ) Kompilatorn: Vi behöver ett heltal, så packa upp det. (Potentiellt problem: Döljer komplexitet!)

Wrappers 6: Python? 44 Python har inga primitiva typer, bara objekttyper Trevligare på ytan slipper bry sig om skillnaden Vanliga heltal är i princip wrapperobjekt, har metoder! I Java: Kan välja mellan Primitiva typer inte objekt, vissa begränsningar Wrapperklasser är objekt, men långsammare, kräver mer minne

Java Collections Framework jonas.kvarnstrom@liu.se 2017

Collections Framework 1: Intro 46 Collections Framework: Många sammansatta datastrukturer 1) Uppsättning gränssnitt för listor, köer, mängder, mappningar De viktigaste: Kom ihåg: Gränssnitt ger oss frihet att välja implementation!

Collections Framework 2: Intro 47 2) En uppsättning implementationer 3) Några hjälpklasser

Collection, List 48 : Generell samling av objekt Vissa samlingar är ordnade Listor har ett första element inte mängder Vissa tillåter dubblerade element Listor kan innehålla två identiska element inte mängder Alltid ordnad: Element har index Implementeras av Mycket vanlig, implementation liknar våra tidigare exempel Ganska vanlig, andra egenskaper, Använd inte, deprecated

List-funktionalitet 49 Se websidorna:

Queue 50 Kan lägga till i slutet av kön Kan ta bort i början av kön Implementeras av, grundläggande köstrukturer Varianter Även "på andra sidan" (Double-Ended QUEue) har element i sorterad ordning Operation Signalerar fel exception Returnerar speciellt värde Stoppa in element Ta bort element Se på första elementet Vad händer om det är omöjligt? När man vet att det ska gå bra annars är ngt fel När man vill prova om det går bra

Iteration 1: Med index 52 Hur kan man iterera över alla element i en samling? Med en array eller fungerar index utmärkt:

Iteration 2: Med index 53 Hur kan man iterera över alla element i en samling? Med en fungerar index, men långsamt: get(0): Gå genom element j=0 get(1): Gå genom element j=0, 1 get(2): Gå genom element j=0, 1, 2 get(3): Gå genom element j=0, 1, 2, 3 get(4): Gå genom element j=0, 1, 2, 3, 4

Iteration 3: Utan index 54 Hur kan man iterera över alla element i en samling? Med en generell (eller ) finns inga index! Vi är egentligen inte intresserade av index! Vi vill veta: Finns det fler element? Vad är nästa element?

Iteration 4: Iterator 55 Lösning: Gränssnittet Iterator Finns det fler element? Vad är nästa element? Specialsyntax: Iterator för vilken elementtyp som helst Vet inte vilken elementtyp men: Det är i alla fall någon sorts Object! Har en egen implementation för varje datastruktur, eget sätt att hålla reda på "var vi är just nu"

Iteration 5: Iterable och for(each)-loopar 56 Gränssnittet säger att objektet kan ge oss en iterator Implementeras av Collections och arrayer, kan användas i for Loopen anropar haystack.iterator() Anta haystack är LinkedList LinkedList.iterator() returnerar new LinkedListIterator(), som vet hur man effektivt itererar över länkade listor

Iteration 6: ConcurrentModificationException 57 Om man ändrar en samling medan man itererar över den: Har inget att göra med multitrådning!

Iteration 7: Ta bort element 58 Iterator har en tredje metod Ta bort elementet som just returnerades av next() Tas bort via iteratorn ingen ConcurrentModificationException

"Fortsättning" i nästa kurs 59 Mer om datastrukturer: TDDD86 Datastrukturer, algoritmer och programmeringsparadigm, http://kdb- 5.liu.se/liu/lith/studiehandboken/svkursplan.lasso?&k_budget_year=2016&k_ku rskod=tddd86