IOBP2
Datenstrukture und Java-Klassenbibliothek
Datenstrukture und Java-Klassenbibliothek
-
- 1 / 90
-
Flashcards
Listen? (collections)
Dienen zur Speicherung von beliebig vielen Elementen in einer festen Reihenfolge auf die die wahlfrei oder seqquenziell zugegriffen werden kann. (Zu finden im Interface java.util.List und seinen Implementierungen)
Sie stellt zu den Methoden des Collection Interface folgendes zur VErfügugn:
- void add(int index, E element) -> fügt ein Element an der Stelle index ein, verschiebt den Rest nach rechts.
- boolean addAll(int index, Collection<? extends E> c) -> fügt eine ganze Collection an der Stelle index ein. Brauchen einer Vererbungsbeziehung zu der Ziel-Collection. Liefert treu zurück, wenn erfolgreich.
- E remove(int index) -> entfernt das Objekt an Stelle index, liefert eine Referenz auf das gelöschte Objekt zurück.
- set int index, E element) -> tauscht das übergebene Element mit dem an Stelle index
- subList(int fromIndex, int toIndex) -> Liefert einen Ausschnitt der List von fromIndex, zu toIndex zurück. Referenz wird zurück geliefert!
ArrayList?
Ein Liste die mithilfe einer Array-Datenstruktur implementiert wurde.
Vorteil: schneller Zugriff
Nachteil: Aufwändige Änderungen, alle Listenelemente müssen verschoben werden. Kapazitätenanpassung ist sehr umständlich.
LinkedList?
Liste die mithilfe einer doppelten Verkettung von Objektreferenzen implementiert wurde. (Objekte die jeweils eine Referenz auf ihren Vorgänger und ihren Nachfolger haben.)
Arbeitet ohne index, erfordetr möglicherweise durchlaufen der gesamten Liste zum auffinden einer gesuchten Referenz.
Vorteil: Einfügen an beliebiger Stelle geht schnell, da nur Referenzen erstellt werden müssen.
Nachteil: Zugriff ist langsamer als z.B. bei der ArrayList.
Deklaration der LinkedList:
"private List<Artikel> artikelListe = new LinkedList<Artikel>();"
Mengen-Datenstruktur?
Dienen zur VErwaltung von zusammengehörigen ELementen, bei denen die Reihenfolge keine Rolle spielt und in der keine Elemente doppelt vorkommen dürfen. (Zu finde im Interface java.util.Set, und z.B. in den Implementierungen TreeSet und HashSet.)
Es wird bei Mengen sichergestellt dass die folgende Bedingung, nie gilt, für beliebige x und y: x.equals(y) == true
Sonst werden keine neuen Methoden von Set implementiert, es werden lediglich in der API-Dokumentation in natürlicher verfasster Sprache einige Regeln festgehalten, welche gelten sollten.
TreeSet?
Verwaltet die Elemente einer Menge in einer Baum-Struktur (Suchbaum) und ermöglicht die Operationen wie add, remove, contains selbst bei sehr gr0ßen Datenmengen noch mit vertretbarem Aufwand durchgeführt werden.
HashSet?
Verwaltet Mengen mithilfe einer Hashtabelle. Dies ermöglicht einen konstanten Aufwand bei den Operationen add, remove oder conatains. Der schreibende Zugriff dauert etwas länger, da die Zeit zur Berechneung der Hashfunktion berücksichtigt werden muss.
Definition in der Implementierung:
"private Set<Artikel> sortiment = new HashSet<Artikel>();"
Assoziativspeicher (Maps)?
Zu finden in java.util.Map, bietet z.B. die Implementierungen:
- TreeMap (Baum)
- HashMap (Hash-Tabelle)
- LinkedHashMap (Kombination aus Hash-Tabelle und verketteter Liste.)
Primäre Aufgabe dieser Datenstrukturen ist es Schlüssel auf Werte (Objekte) abzubilden. Schlüssel und Wert werden immer paarweise gespeichert und können beliebige Typen sein. Die Datenstruktur zur Speicherung von Schlüssel/Wert-Paaren findet sich im Interface Map.Entry. Es erbt nicht von Collection und kann nicht mit einem Iterator durchlaufen werden. Stattdessen werden folgende Methoden zum iterieren angeboten:
- Set<K> keySet(): Gibt ein Set mit allen Schlüsseln zurück.
- Collection<V> values(): gibt eine Collection mit allen Werten zurück.
- Set<Map.Entry<K,V>> entrySet(): gibt eine Menge zurück die aus den Schlüssel-Wert-Paaren der Map besteht.
Außerdem werden diverse Methoden zur Verwaltung definiert.
Wichtige Regeln für Maps sind:
- Eindeutiger Schlüssel (Einmal oder Keinmal)
- Zu einem Schlüssel exisitiert nur genau ein Wert.
- Soll ein Wert zu einem bereits existierendem Schlüssel gespeichert werden, wird der zugehörige Wert einfach überschrieben.
Wrapper-Klassen?
Können Werte von primitve Datentypen in Objekte kapseln, sodass sie wie Objeekte behandelt werden können.Sie müssen wie jede andere Klasse auch instanziert werden, enthalten den Wert des primitive Datentyps und sind immutable, können also nicht verändert werden wenn sie instanziert wurden.
Die Instanzierung sieht wie folgt aus:
int zahl = 5;
List<Integer> list = new ArrayList<Integer>();
Integer wrapper = new Integer(zahl);
list.add(wrapper);
HashMap?
Keine Sortierung innerhalb des Speichers, Zugriff anhand des HashCodes, also sehr schnell (flache Datenstruktur). Das Speichern dauert etwas länger, aufgrund der mathematisch komplexen Hash-Funktion.
TreeMap?
Speicherung der Elemente in einer Baumstruktur (Suchbaum). Einsortierung anhand des Schlüssels. Zugriff kann länger dauern, da im schlimmsten Fall die gesamte Tiefe des Baumes durchlaufen werden muss. Nur geringfügig länger als bei einer HashMap, dafür geht das Einsortieren wesentlich schneller, da es keine aufwendige mathematische Funktion benötigt.
LinkedHashMap?
spezialisierte HashMap, die ihre Elemente in einer doppelt verketteten Liste speichert., sinnvoll besonders wenn die Ordnung von Elementen eine Rolle spielt.
WeakHashMap?
Ähnelt der HashMap, mit dem Unterschied, dass die Laufzeitumgebung bei Speicherknappheit Elemente löscht.
Undo-Funktionen?
Dienen dem rückgängig machen von Benutzeraktionen. Hierzu müssen alle Aktionen protokolliert werden. Man kann dies mittels eines Stacks verwirklichen, welche im Interface java.util.Deque und den Implementierungen java.util.ArrayDeque (Von den Java-Entwicklern derzeit empfohlen zur Realisierung von Stacks) und java.util.Stack aus dem Interface java.util.List zu finden sind.
Methoden von java.util.Deque zur Verwendung als Stapel-Datenstruktur?
- addFirst(e : E) -> auf den Stapel legen
- removeFirst(): E -> vom Stapel nehmen
- peekFirst(): E -> oberstes Element lesen
Queues (Schlangen)?
Bearbeitung in der Reihenfolge first in, first out. Zu finden im Interface java.util.Queue und z.B. der Implementierung java.util.LinkedList.
Es gibt jedoch eine große Auswahl unterschiedlicher Techniken zur Implementierung von Listen oder Warteschlangen. Hierbei gibt es viele weiter untergliederten Interfaces, die implementiert wurden. Zwei Implementierungen verwenden direkt das Interface Queue<E> die PriorityQueue<E> (Sortierung anhand der Priorität) und die ConcurrentLinkedQueue<E>(Eine übliche Queue, die intern als einfach verkettete Liste gespeichert wird und im Zusammenhang mit parallelen Thread (Programmfäden) genutzt werden kann..
BlockingQueues?
Wechseln in einen Wartezustand wenn kein Speicherplatz verfügbar ist oder ein anderer Programmfaden auf die Queue zugreift.
Zeichenketten?
Bestehen aus einer Sequenz von Zeichen. Werden für die textuelle Repräsentation von Informationen verwendet. Sie gehören nicht zu den primitiven Datentypen, sondern arbeiten als Objekte der Klasse java.lang.String.
Wege zum Erzeugen von Zeichenketten (Instanzen der Klasse java.lang.String)?
- Literal-Schreibweise:
- Mit ihrer Hilfe können bestimmte Werte direkt als Zeichenfolgen im Quellcode angegeben werden.
- Verknüpfen von Strings mittels des Plus-Operators. (Auch Verknüpfungen von Strings und primitive Datentypen werden zu Strings verknüpft.)
- Konstruktoren der Klasse String
- Leerer String: "String leer = new String();"
- Copy-Konstruktor: "String kopie = new String("Original");"
- Instanzierung mit Char- oder Byte-Array: "char[] c = {'J', 'a', 'v', 'a'}; String ausChars = new String(c);"
Es gibt jedoch keinen Konstruktor für die Erzeugung eines Strings aus Zahlen oder Wahrheitswerten. Hierzu müssen diese entweder mit einem Leerstring verknüpft werden, oder durch eine implizite Konvertierung verwandelt werden. (z.B.: "String aString1 = String.valueOf(a);")
Umwandlung vom String in einen primitiven Datentyp?
Nur möglich beii gültigem Format, wird umgesetzt durch die statischen Methoden der Wrapper-Klassen.
z.B.:
"String byteString = "127";
byte byt = Byte.parseByte(byteString);"
Für ein ungültiges Format wird eine NumberFormatException geworfen.
Methoden für Teilstring-Vergleiche?
- boolean contains(String s)
- true wenn s enthalten, sonst false.
- boolean startsWith(String prefix)
- true falls der String mit dem übergebenen String prefix beginnt, sonst false.
- boolean endsWith(String suffix)
- true falls der String mit dem übergebenen String suffix endet, sonst false.
- int indexOf(char c/String s)
- Gibt den Index zurück an dem der übergebene char/string das erste mal auftaucht, falls nicht vorhanden gibt er -1 zurück.
- int lastIndexOf(char c/ String s)
- Gibt den Index zurück an dem der übergebene char/string das letzte mal auftaucht, falls er nicht vorkommt -1.
Methoden zur Manipulation von Strings?
- char charAt(int index)
- Gibt das Zeichen an der Stelle index zurück
- String substring(int anfang, int ende)
- Gibt den teilstring zwischen dem index anfang und ende zurück.
- String replace(char alt, char neu/String alt, String neu)
- Gibt einen String zurück in dem alle Vorkommnisse von alt durch neu ersetzt werden.
- String toLowerCase()
- Gibt den kompletten String klein geschrieben zurück
- String toUpperCaase()
- Gibt den kompletten String groß geschrieben zurück.
- String trim()
- Entfernt alle nicht druckbaren Zeichen am Anfang und Ende des Strings. (Leerzeichen, Tabulatoren, Zeilenumbrüche etc.)
Besonderheit bei der Veränderung von Strings?
Strings sind unveränderlicher Objekte. Methoden die ihren Zustand ändern, erzeugen lediglich einen neuen String mit dem neuen Inhalt.
Methoden zum Vergleich von Strings?
- equals
- Gibt true zurück wenn die exakt selben Zeichen in der selben Reihenfolge vorhanden sind. Dabei wird auch auf Groß- und Kleinschreibung geachtet. Um dies zu umgehen existiert die Methode equalsIgnoreCase
- compareTo
- Vergleicht Strings anhand ihrer lexikographischen Ordnung, ist also vergleichbar mit der Sortierung in einem Telefonbuch. Hier existiert ebenfalls eine Methode zum Ignorieren von Groß- und Kleinschreibung: compareToIgnoreCase.
String-Verkettung?
Das Zusammenfügen von zwei Strings zu einem. Die Zeichenkette des zweiten wird direkt hinter die des ersten geschrieben. Bei der Erzeugung wird für jedes Verkettungsoperation ein temporärer Zwischenstring gespeichert.
StringBuffer?
Eine Klasse, für deren Instanzen die Möglichkeit besteht mittels der Methode append beliebig viele Strings anzufügen, ohne dass unnötig zusätzliche Objekte erzeugt werden. Sie werden in einem temporärer Puffer gehalten und erst durch den Aufruf der Methode toString zum resultierenden String zusammengebaut.
split-Methode?
Zerlegt einen String in einzelne Strings, anhand einer Trennzeichenkette und gibt die einzlenen Teile als einen Array von Strings zurück.
Per Substring und indexOf sowie lastIndexOf lassen sich störende Zeichen an Anfang und Ende des Arrays entfernen.
java.util.Date?
Objekte dieser Klasse stellen einen Zeitpunkt dar. Sie umfassen ein Datum, sowie eine Uhrzeit mit der kleinsten Auflösung in Millisekunden. Der Default-Konstruktor erzeugt ein Objekt, das den genauen Zeitpunkt seiner Erzeugung reproduziert. Außerdem existieren überladene Konstruktoren mit denen sich die einzlenen Attribute eines Datums gezielt setzen lassen. Ausnahme sind die Millisekunden welche sich weder per Konstruktor noch per Setter setzen lassen.
Methoden der Klasse Date?
- before
- after
- compareTo
SimpleDateFormat?
Ermöglicht über die Klasse java.text.SimpleDateFormat das formatieren des Datums anhand eines Musters, mit dem der Benutzer genau angeben kann, wie ein Datum als String dargestellt werden soll. Reihenfolge der Attribute, Trennzeichen usw.
Folgendes sind die Zeichen zur Definition:
- y für die Jahre
- M für die Monate
- d für die Tage
- E Name des Tages
Einlesen von Datumseingaben und deren Umwandlung in echte Date-Objekte?
parse-Methode des SimpleDateFormats:
"SimpleDateFormat sdf;
sdf = new SimpleDateFormat("dd.MM.yyyy");
String datumString = "31.12.2013";
Date datum = sdf.parse(datumString);"
Wird eine nicht passende Zeichenkette übergeben kann eine ParseException auftreten.
Klasse java.util.Calendar?
Abstrakte Oberklasse für die in der Java-Klassenbibliothek verfügbaren Kalendarsysteme. (Für Europa wichtig: java.util.GregorianCalendar)
Die Verwendung von GregorianCalendar ähnelt der von Date. Man erhält ein Objekt das den Zeitpunkt der Erstellung repräsentiert, und es stehen überladenen Konstruktoren zur Verfügung.
Setzen von Attributen bei GregorianCalendar-Objekten?
Es existieren entsprechende Setter-Methoden.
kalendar1.set(Calendar.YEAR, 2016);
kalendar1.set(Calendar.MONTH, Calendar.AUGUST);
kalendar1.set(Calendar.DAY_OF_MONTH, 24);
kalendar1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
kalendar1.set(Calendar.HOUR_OF_DAY, 20);
kalendar1.set(Calendar.MINUTE, 18);
kalendar1.set(Calendar.SECOND, 12);
Für das Abfragen existiert eine allgemeine get-Methode, die ähnlich funktioniert. Man verwendet diesselben Konstanten.
Wichtigste Methode eines GregorianCalendar Objekts?
roll-Methode, mit der einzelne Attribute einfach weitergeschaltet werden können. Sie funktioniert wie die Set- und Get-Methoden:
datum.roll(Calendar.MONTH, 6);
Desweiteren lässt sichmit der getTime-Methode ein normales Date-Objekt erhalten, um es z.B. mittels sdf zu formatieren.
Wichtige Klassen für den Umgang mit dem Dateisystem, Verzeichnissen und Dateien?
Zu finden im Paket java.io. Die wichtigste Klasse ist die Klasse File. File-Instanzen repräsentieren Dateipfade, an denen Ordner und Dateien vorhanden sein oder erstellt werden können.
listRoots-Methode?
Listet die Wurzelverzeichnisse auf. Gibt einen Array mit File-Objekten zurück, die die vorhandenen Wurzelverzeichnisse auflisten.
listFiles-Mathode?
Zählt die in den Verzeichnissen enthaltenen Unterverzeichnisse und Dateien auf.
Dateisystempfad?
Ist eine Zeichenkette, die den Pfad zu einem Ordner, bzw. einer Datei in einem Dateisystem darstellt. DIe Ordner und Unterordner im Pfad werden über ein spezielles Trennzeichen voneinander getrennt.
File.seperator?
Ist ein plattformunabhängiges Trennzeichen, welches es einem erspart für jedes OS Dateipfade anders implementieren zu müssen.
Methoden zur Abfrage von Dateiinformationen?
- exists()
- isDirectory()
- isFile()
- canRead()
- canWrite()
- length()
- lastModified()
mkdir und mkdirs Methoden?
Legen neue Verzeichnisse, oder sogar Verzeichnisspfade an und liefern zurück ob die Operation erfolgreich war.