Software Entwicklung 1

Ähnliche Dokumente
JAVA KURS COLLECTION

Datenstrukturen in Java

Nützliche Utility-Klassen des JDK

Java Einführung Collections

Teil V. Generics und Kollektionen in Java

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Programmieren in Java

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Java Generics & Collections

Einführung in die Informatik 2

4. Hashverfahren. geg.: Wertebereich D, Schlüsselmenge S = {s 1,..., s n } D. Menge A von Speicheradressen; oft: A = {0,..., m 1}

Geordnete Binärbäume

Bäume, Suchbäume und Hash-Tabellen

Informatik II, SS 2014

Grundlagen der Informatik Generische Klassen

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Java I Vorlesung 6 Referenz-Datentypen

1 Hashing und die Klasse String

Vorlesung Datenstrukturen

Interfaces und Vererbung

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Schnittstellen implementieren am Beispiel Suchbaum

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Programmieren II. Hierarchie von Collections. Vorlesung 3. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2010

Objektorientierte Programmierung

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Vorlesung Programmieren

Advanced Programming in C

4.4.9 Das Java Collection Framework

Hashing. Algorithmen und Datenstrukturen II 1

Zusatzmaterial DIE KLASSE OBJECT. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Objektorientierte Programmierung

2. Programmieren gegen Schnittstellen Advanced Programming Techniques

Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Algorithmen und Datenstrukturen in Java Jiri Spale, Algorithmen und Datenstrukturen in Java 1

Handbuch für die Erweiterbarkeit

Probeklausur: Programmierung WS04/05

Grundlagen der Programmierung

Theorie zu Übung 8 Implementierung in Java

Software Engineering Klassendiagramme Assoziationen

Einführung in die Informatik 2

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 10

Objektorientierte Programmierung

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

Grundkonzepte java.util.list

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Stapel (Stack, Keller)

OOP. Tagesprogramm. Dynamische Typinformation. Homogene Übersetzung der Generizität. Generizität und Typumwandlungen

Allgemeine Informatik II SS :30-13:30 Uhr

Algorithmen und Datenstrukturen

Selbststudium OOP Programmieren 1 - H1103 Felix Rohrer

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Informatik II, SS 2014

1 Polymorphie (Vielgestaltigkeit)

6. Interfaces Grundlagen der Programmierung 1 (Java)

Generische Datenstrukturen

AuD-Tafelübung T-B5b

Software Entwicklung 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Gebundene Typparameter

Aufgabenblatt Nr. 5 Generizität und TicTacToe

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

12) Generische Datenstrukturen

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Vom objektorientierten Entwurf zur Implementierung in Java. 2. Dezember 2014

Probeklausur: Programmierung WS04/05

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Java Weiterführende Arrays. 1 Einleitung. AnPr

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Programmierstil. Objektsammlungen. Konzepte. Zwischenspiel: Einige beliebte Fehler... Variablennamen Kommentare Layout Einrückung

Suchen und Sortieren

Suchen in Listen und Hashtabellen

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Vorlesung Programmieren

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

6 Speicherorganisation

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Institut fu r Informatik

Programmieren I. Kapitel 8. Vererbung

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Repetitorium Informatik (Java)

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Programmieren I. Kapitel 5. Kontrollfluss

Maps (Dictionaries, assoziative Speicher)

Untersuchen Sie, inwiefern sich die folgenden Funktionen für die Verwendung als Hashfunktion eignen. Begründen Sie Ihre Antwort.

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 5, Donnerstag, 20.

Praktische Übung 'JUnit-Test'

Transkript:

Software Entwicklung 1 Annette Bieniusa AG Softech FB Informatik TU Kaiserslautern

Was gefällt Ihnen? Sehr ausführliches Skript Fragen / Aufgaben in der Vorlesung Praktische Beispiele Tolle Aufgabenblätter und gutes Abgabesystem (1x genannt) Tutorien Fragen werden beantwortet Bieniusa Software Entwicklung 1 2/ 50

Verbesserungsvorschläge Folien zum Download Weniger Fehler im Skript Mehr Erklärungen im Skript Mehr praktische/große/schwierigere Anwendungsbeispiel in der Vorlesung Vorlesung um 10:00 Bieniusa Software Entwicklung 1 3/ 50

Kontroverse Punkte Für Anfänger (zu) schwierig vs. alles schon bekannt Zuviel Stoff Anwesenheit in den Übungen Wiederholungen: Gut oder schlecht?! Sie beantwortet zwar Fragen jedoch stellt man Fragen nur zum Thema der Vorlesung der Rest hat in der Vorlesung recht wenig verloren. Bieniusa Software Entwicklung 1 4/ 50

Was uns gefällt! Dass Sie Fragen stellen und mitdenken! Schnelle Rückmeldung bei Fehlern und Ungenauigkeiten auf den Aufgabenblättern Dass Sie nicht auf den letzten Moment warten... Bieniusa Software Entwicklung 1 5/ 50

Übesicht: Die wichtigsten Collections Interface Hashtable Resizable Array Balanced Tree LinkedList Hashtable + LinkedList Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Deque ArrayDeque LinkedList Map HashMap TreeMap LinkedHashMap Quelle: https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html Bieniusa Software Entwicklung 1 6/ 50

Abstrakte Datentypen: Maps Bieniusa Software Entwicklung 1 7/ 50

Abstrakte Datentypen: Maps Indexstrukturen (engl. maps oder dictionary) erlauben eine effiziente Verwaltung von Daten (hier: Objekten). Ein Datensatz besteht aus einem eindeutigen Schlüssel und dem ihm zugeordneten Wert. Die Verwaltung von Datensätzen basiert auf den folgenden drei Grundoperationen: Einfügen eines Datensatzes in eine Menge von Datensätzen Suchen eines Datensatzes mit Schlüssel k Löschen eines Datensatzes mit Schlüssel k Bieniusa Software Entwicklung 1 8/ 50

Implementierungen für Maps In vereinfachter Anlehnung an java.util.map legen wir für die hier diskutierten Implementierungen folgende Schnittstelle zugrunde: interface Map { String get ( int key ); void put ( int key, String value ); void remove ( int key ); Nicht-parametrisierte Variante mit int-schlüsseln und String-Daten. Für jeden Schlüssel max. einen Datensatz Bieniusa Software Entwicklung 1 9/ 50

Beispiel: Abbildung Zahl auf Monatsname Map monate = new... // Implementierung folgt spaeter monate. put (1, " Januar "); monate. put (2, " Februar ");... monate. put (12, " Dezember "); System. out. println (" Monat : " + monate. get (4) ); // Monat : April Bieniusa Software Entwicklung 1 10/ 50

Implementierungen für Maps Hier: Drei Varianten aufbauend auf verschiedenen Datenstrukturen A. Liste B. Suchbäume C. Hashtabellen Dabei betracheten wir jeweils die Datenstruktur die drei grundlegenden Operationen eine einfache Komplexitätsabschätzung Bieniusa Software Entwicklung 1 11/ 50

A. Maps basierend auf Listen Bieniusa Software Entwicklung 1 12/ 50

Maps basierend auf Listen Hier: Vereinfachend ohne Getter und Setter Zum Suchen etc. wird der Schlüssel der Datensätze verwendet Ergebnis ist der String value // Repraesentierung eines Datensatzes class DataSet { int key ; String value ; DataSet ( int k, String v) { this. key = k; this. value = v; Bieniusa Software Entwicklung 1 13/ 50

Implementierung I import java. util.*; class ListMap implements Map { private List < DataSet > elems ; public ListMap () { elems = new ArrayList < DataSet >() ; public String get ( int key ) { for ( DataSet d : elems ) { if (d. key == key ) { return d. data ; return null ; Bieniusa Software Entwicklung 1 14/ 50

Implementierung II public void put ( int key, Strings value ) { for ( DataSet d : elems ) { if (d. key == key ) { d. data = value ; return ; elems. add ( new DataSet (key, value )); Bieniusa Software Entwicklung 1 15/ 50

Implementierung III // Elemente koennen nur ueber Iterator // waehrend des Iterierens entfernt werden! public void remove ( int key ) { Iterator < DataSet > iter = elems. iterator (); while ( iter. hasnext ()) { DataSet d = iter. next (); if (d. key == key ) { iter. remove (); return ; Bieniusa Software Entwicklung 1 16/ 50

Diskussion Frage Vorteile Einfach zu implementieren Nachteile Suchen, Einfügen und Löschen sind langsam Linearer Aufwand: Man muss über bis zu N Elemente iterieren, um in der List-Map mit N Einträgen ein Element zu finden. In welchem Fall benötigt man N Schritte, um ein Element zu finden? Bieniusa Software Entwicklung 1 17/ 50

B. Maps basierend auf Suchbäumen Bieniusa Software Entwicklung 1 18/ 50

Maps basierend auf Suchbäumen Suche von Elementen auf Suchbäumen (aka binären markierten Binärbäumen) ist effizienter als die Suche in einer Liste ( Vorlesung zu Suchen und Sortieren) Verwende als Knoten-Markierung den Schlüssel Weiteres Attribut value für Daten-Objekt Methoden wie bei SortedBinTree // Knoten fuer Binaerbaeume class TreeNode { int key ; String value ; TreeNode left, right ; TreeNode ( int k, String v) { this. key = k; this. value = v; Bieniusa Software Entwicklung 1 19/ 50

C. Hashing/Streuspeicherung Idee: Berechne aus dem Schlüssel die Positionsinformation des Datensatzes (z.b. den Arrayindex)! Für viele praktisch relevante Szenarien erreicht man dadurch Datenzugriff mit konstantem Aufwand. Bieniusa Software Entwicklung 1 20/ 50

Begriffsklärung: Hashfunktion, -tabelle I Seien S die Menge der möglichen Schlüsselwerte (Schlüsselraum) und A die Menge von Adressen in einer Hashtabelle (im Folgenden ist A immer die Indexmenge 0... m 1 eines Arrays). Eine Hashfunktion h : S A ordnet jedem Schlüssel eine Adresse in der Hashtabelle zu. Als Hashtabelle (HT) der Größe m bezeichnen wir einen Speicherbereich, auf den über die Adressen aus A mit konstantem Aufwand (also unabhängig von m) zugegriffen werden kann. Bieniusa Software Entwicklung 1 21/ 50

Begriffsklärung: Hashfunktion, -tabelle II Enthält S weniger Elemente als A, kann h injektiv sein: Für alle s, t in S : s t h(s) h(t) D.h. die Hashfunktion ordnet jedem Schlüssel eine eineindeutige Adresse zu. Andernfalls können Kollisionen auftreten. Bieniusa Software Entwicklung 1 22/ 50

Begriffsklärung: Kollision, Synonym Zwei Schlüssel s, t kollidieren bezüglich einer Hashfunktion h, wenn h(s) = h(t). Die Schlüssel s und t nennt man dann Synonyme. Die Menge der Synonyme bezüglich einer Adresse a aus A heißt die Kollisionsklasse von a. Ist schon ein Datensatz mit Schlüssel s in der Hashtabelle gespeichert, nennt man einen Datensatz mit einem Synonym von s einen Überläufer. Bieniusa Software Entwicklung 1 23/ 50

Anforderungen an Hashfunktionen Eine Hashfunktion soll sich einfach und effizient berechnen lassen zu einer möglichst gleichmäßigen Belegung der Hashtabelle führen möglichst wenige Kollisionen verursachen Bieniusa Software Entwicklung 1 24/ 50

Klassifikation von Hashverfahren Hashverfahren unterscheiden sich durch die Hashfunktion durch die Kollisionsauflösung: Verkettung: Überläufer werden in einer Liste an der Position der Hashtabelle eingefügt offen: Überläufer werden an noch offenen Positionen der Hashtabelle gespeichert durch die Wahl der Größe der Hashtabelle: statisch: Die Größe wird bei der Erzeugung festgelegt und bleibt unverändert. dynamisch: Die Größe kann angepasst werden. Hier: Statische Hashtabelle mit Kollisionsauflösung durch Verkettung Bieniusa Software Entwicklung 1 25/ 50

Skizze key3 v3 key2 v2 key1 v1 key : S h(. ) h(key) : A Bieniusa Software Entwicklung 1 26/ 50

Hashfunktion Entscheidend ist, dass die Hashfunktion die Schlüssel gut streut. Verbreitetes Verfahren: Wähle eine Primzahl als Hashtabellen-Größe. Wähle den ganzzahligen Divisionsrest als Hashwert: private int hash ( int key ) { return Math. abs ( key % hashtable. length ); Bieniusa Software Entwicklung 1 27/ 50

Datenstruktur I Ein Eintrag in der Hashtabelle wird durch ein Objekt der folgenden Klasse repräsentiert: class HashEntry { int key ; String value ; HashEntry next ; HashEntry ( int k, String v) { this. key = k; this. value = v; Bieniusa Software Entwicklung 1 28/ 50

Datenstruktur II Wir realisieren eine Hashtabelle als Implementierung der Schnittstelle Map: class HashMap implements Map { private HashEntry [] table ; public HashMap ( int tabsize ) { /* tabsize sollte eine Primzahl sein */ this. table = new HashEntry [ tabsize ]; private int hash ( int key ) {... public String get ( int key ) {... public void put ( int key, String v ){... public void remove ( int key ) {... Bieniusa Software Entwicklung 1 29/ 50

Datenstruktur III Invarianten: Die Hashtabelle enthält den Datensatz zu s, wenn table[ h(s) ]!= null und für ein Element entry der verlinkten Liste startend bei table[ h(s) ] gilt: entry.key == s Die Daten liefert dann entry.value. Alle Elemente der Kollisionsklasse zu h(s) befinden sich in der Liste an Position h(s) der Hashtabelle. Bieniusa Software Entwicklung 1 30/ 50

Einfügen public void put ( int key, String value ) { if( value!= null ) { int hix = hash ( key ); HashEntry currententry = table [ hix ]; HashEntry newentry = new HashEntry ( key, value ); newentry. next = currententry ; table [ hix ] = newentry ; Bieniusa Software Entwicklung 1 31/ 50

Suchen public String get ( int key ) { int hix = hash ( key ); HashEntry entry = table [ hix ]; while ( entry!= null ) { if ( entry. key == key ) { return entry. value ; entry = entry. next ; return null ; Bieniusa Software Entwicklung 1 32/ 50

Löschen public void remove ( int key ) { int hix = hash ( key ); HashEntry entry = table [ hix ]; // entfernen alle HashEntries mit dem gegebenen Schluessel HashEntry dummy = new HashEntry (0, null ); dummy. next = entry ; HashEntry current = dummy ; while ( current. next!= null ) { if( current. next. key == key ) { // entferne den Eintrag current. next = current. next. next ; else { // gehe zum naechsten Eintrag current = current. next ; table [ hix ] = dummy. next ; Bieniusa Software Entwicklung 1 33/ 50

Diskussion Die Komplexität der Operationen einer Hashtabelle ist abhängig von der Hashfunktion und dem Füllungsgrad der Tabelle dem Verfahren zur Kollisionsauflösung Bei guter Hashfunktion und kleinem Füllungsgrad kommt man im Mittel mit konstant vielen Operationen aus. Bieniusa Software Entwicklung 1 34/ 50

Bemerkung Die gezeigte Implementierung ist nicht optimal. Im schlechtesten Fall haben die Operationen einen Aufwand, der linear mit der Anzahl der Einträge in der Hashtabelle zunimmt. Wann tritt dieser ungünstigste Fall ein? Bieniusa Software Entwicklung 1 35/ 50

Bemerkung Die gezeigte Implementierung ist nicht optimal. Im schlechtesten Fall haben die Operationen einen Aufwand, der linear mit der Anzahl der Einträge in der Hashtabelle zunimmt. Wann tritt dieser ungünstigste Fall ein? Mögliche Optimierungen: Sortierung der HashEntry-Liste Implementierung der Kollisionsauflösung mit Hilfe eines Suchbaums Bieniusa Software Entwicklung 1 35/ 50

Generische Maps Bieniusa Software Entwicklung 1 36/ 50

Maps im Java Collections Framework interface Map <K,V> { // Liefert das Objekt unter Schluessel key ; // falls nicht vorhanden, wird null zurueckgegeben V get ( Object key ); // Fuegt den Wert value unter Schluessel key ein // liefert das Objekt, der zuvor unter key eingetragen war ; // falls nicht vorhanden, wird null zurueckgegeben V put (K key, V value ); // Entfernt den Eintrag unter Schluessel key ; // Liefert das bisher eingetragene Objekt // falls nicht vorhanden, wird null zurueckgegeben V remove ( Object key ); // Liefert ein Set mit allen eingetragenen Schluesseln Set <K> keyset (); // Liefert ein Set mit allen Eintraegen Set <Map. Entry <K,V>> entryset ();... Bieniusa Software Entwicklung 1 37/ 50

Hashen von Objekten Bis jetzt haben wir als Schlüssel nur ganzzahlige Werte betrachtet. Bei der generischen Implementierung sind Schlüssel von einem Objekttyp. Ein als Objekttyp vorliegender Schlüssel muss in einen numerischen Wert umgewandelt werden (Hashadresse). In Java implementiert und verwendet man dazu die Methode int hashcode() der Klasse Object. Bieniusa Software Entwicklung 1 38/ 50

Hashen von Objekten (Code) class HashMap <K, V > implements Map <K, V > {... private int hash ( K key ) { return Math. abs ( key. hashcode () % table. length ); public V get ( K key ) { int hix = hash ( key ); HashEntry <K, V > entry = table [ hix ]; while ( entry!= null ) { if ( entry. key. equals ( key )) { return entry. value ; entry = entry. next ; return null ; Bieniusa Software Entwicklung 1 39/ 50

Vergleichen von Objekten Bieniusa Software Entwicklung 1 40/ 50

Vergleich von Objekten Um Objekte zu sortieren ( TreeMap), muss eine Ordnung auf ihnen definiert werden. Java: Comparator Interface Bieniusa Software Entwicklung 1 41/ 50

Das Comparator Interface interface Comparator <T > { public int compare ( T o1, T o2); compare (x,y) liefert einen int-wert < 0, falls x kleiner als y = 0, falls x gleich y > 0, falls x größer als y Merkhilfe: compare(x,y) < 0, genau dann wenn x < y Forderung: Konsistenz mit equals bei Verwendung mit SortedSet or SortedMap compare (x,y) == 0 genau dann, wenn x.equals(y) den Wert true liefert Bieniusa Software Entwicklung 1 42/ 50

Beispiel: Date-Objekte vergleichen import java. util. Comparator ; public class DateComparator implements Comparator < Date > { public int compare ( Date d1, Date d2) { int result = d1. getyear () - d2. getyear (); if ( result == 0) { result = d1. getmonth () - d2. getmonth (); if ( result == 0) { result = d1. getday () - d2. getday (); return result ; Bieniusa Software Entwicklung 1 43/ 50

Erwünschte Eigenschaften von equals() reflexiv: Für jede Referenz x mit x!= null,sollte x.equals(x) den Wert true liefern. symmetrisch: Für jede Referenz x und y mit x,y!= null, sollte x.equals(y) den Wert true liefern, genau dann wenn y.equals(x) true liefert. transitive: Für jede Referenz x,y,z mit x,y,z!= null, sollte x.equals(z) den Wert true liefern, wenn x.equals(y) und y.equals(z) true liefert. konsistent: Mehrfache Aufrufe von x.equals(y) sollten true bzw. false liefern, solange die referenzierten Objekte zwischenzeitlich nicht verändert wurden. Falls x!= null, sollte x.equals(null) immer false liefern. Bieniusa Software Entwicklung 1 44/ 50

Anpassung von equals in Klasse Date Die equals() Methode wird von der Klasse Object geerbt und kann bzw. muss bisweilen überschrieben und angepasst werden. public class Date {... public boolean equals ( Object obj ) { if ( this == obj ) { return true ; if ( obj == null ) { return false ; if (!( obj instanceof Date )) { return false ; // andere Klasse Date other = ( Date ) obj ; return this. year == other. year && this. month == other. month && this. day == other. day ; Bieniusa Software Entwicklung 1 45/ 50

equals() und hashcode() Gleiche Objekte müssen gleichen Hashcode haben ( Suchen von Einträgen in Hashtable) Date x = new Date (24,12,2016) ; Date y = new Date (24,12,2016) ; assertequals (x, y); // mit angepasster equals () Methode assertequals ( x. hashcode (),y. hascode ()); // wuenschenswert Bieniusa Software Entwicklung 1 46/ 50

Ein schlechter Ansatz: Summe der Attribute public class Date {... public int hashcode () { return this. day + this. month + this. year ; Korrekt: Gleiche Objekte haben gleichen Hashcode Hohe Kollisionswahrscheinlichkeit: new Date(24,12,2016), new Date(23,11,2016), new Date(23,12,2017),... Bieniusa Software Entwicklung 1 47/ 50

Besser: Objects.hash() Die Implementierung einer hashcode() Methode, die die Ergebnisse optimal streut, ist nicht einfach. Gutes Schema: Multipliziere die einzelnen Komponenten, die bei der Berechnung des Hashwertes einfließen, mit einer Primzahl multipliziert und addiere dann hash nimmt eine beliebig Anzahl an Parametern public class Date {... public int hashcode () { return Objects. hash ( this.day, this. month, this. year ); Bieniusa Software Entwicklung 1 48/ 50

Zusammenfassung: Die wichtigsten Collections Interface Hashtable Resizable Array Balanced Tree LinkedList Hashtable + LinkedList Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Deque ArrayDeque LinkedList Map HashMap TreeMap LinkedHashMap Quelle: https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html Bieniusa Software Entwicklung 1 49/ 50

Typische Verwendung Hinzufügen und Entfernen von Elementen Ausgabe aller Elemente Zusammenführen / Vereinigen von Collections Filtern von Elementen nach bestimmten Kriterien Transformieren von einer Liste in eine andere Liste Aggregieren von Information Bieniusa Software Entwicklung 1 50/ 50