IOBP2
Datenstrukture und Java-Klassenbibliothek
Datenstrukture und Java-Klassenbibliothek
-
- 1 / 90
-
Flashcards
Kommentare?
Werden direkt in den Quelltext geschrieben und erläutern Sinn & Zweck des Codes direkt an Ort & Stelle.
Es gibt die Möglichkeit mit einem doppelten Slash ("//") alles was danach in der Zeile steht als Kommentar zu deklarieren oder hierfür eine Klamme zu verwenden, welche aus einem Slash und einem Stern zum Öffenen, sowie einem Stern und einem Slash zum Schließen besteht. ("/*.....*/")
Typische Kommentare sind:
- Klassenkommentare
- Attributkommentare und
- Methodenkommentare.
Klassenkommentare?
- Zweck einer Klasse
- Umstände zur Verwendung
- Vererbung und was dabei zu beachten ist.
Attributkommentare?
Beschreiben die Bedeutung eines Attributs für die Klasse.
Methodenkommentare?
Dokumentieren den Zweck der Methode, was die Parameter der Methode bedeuten, und was von der Methode unter welche Bedingungen zurückgegeben wird.
Javadoc?
Ist ein Programm, das automatische eine Dokumentation aus speziell kommentiertem Quellcode erstellt. Eingebunden werden nur geklammerte Kommentare die Mit einem doppelten Stern nach dem Slash eröffnet werden. ("/**....*/")
Javadoc erzeugt HTML-Seiten als Codedokumentation, also darf innerhalb der Kommentare auch HTML-Quellcode verwendet werden.
Zur Beschreibung von Methoden und diversen Details stehen sogenannte Javadoc-Tags zur Verfügung, z.B.:
- @param (Beschreibung Methodenparameter. Pro Parameter wird ein @param verwendet.)
- @return (Beschreibung dessen was zurückgegeben wird)
- @throws (Aufführung möglicher Fehlerquellen und die Exceptions die dabei geworfen werden. Pro Exception wird ein @throws verwendet.)
- @author (Angabe des Urhebers)
- @version (Versionsangabe).
Meta-Informationen?
Zusätzliche Details zum Quellcode, die Aussagen über den Code machen.
Annotationen?
Meta-Informationen zum Quellcode, die vom Java-Compiler und zur Laufzeit programmatisch ausgewertet werden können.
Zum Beispiel:
- @Override: Kennzeichnet überschriebene Methoden. Compiler gibt einen Fehler aus, falls die so gekennzeichnete Methode keine andere überschreibt.
- @Deprecated: Kennzeichnet veraltete Klassen, Attribute und Methoden, welche nicht mehr genutzt werden sollen. Im Code der diese Codeteile benutzt wird dadurch eine Warnung ausgelöst.
Code-Konventionen?
Allgemeine Regeln zur Formatierung von Code, welche die Lesbarkeit und Verständlichkeit des Codes wesentlich erleichtern. Insbesondere wenn mehrere Personen an einem Projekt arbeiten und auf Quellcode anderer Entwickler zugreifen müssen. Diese Konventionen wirken sich auf die Strukturierung und Formatierung, sowie die Benennung von Variablen und Methoden aus.
Konventionen zur Benennung von Code?
- Paketnamen stets klein geschrieben
- Klassen und Interfaces stets mit Substantiv beschrieben und großer Anfangsbuchstabe. verwendung von Camel-Cases bei zusammengesetzten Wörtern.
- Klassenkonstante werden komplett groß geschrieben und mit Unetrstrich getrennt.
- Methodennamen möglichst als Verben, kleiner Anfangsbuchstabe und Camel-Case.
- Attribute und Variablen sinnvoll benennen um Inhalt daraus schließen zu können.
Konventionen bei Code-Blöcken?
- Einrückung innerhalb eines Code-Blocks,
- Schließende Schweifklammer auf Höhe der Öffnung des Block unterhalb der letzten Zeile.
- Benötigte Variablen zu Beginn deklarieren und gleichzeitig initialisieren.
- Eine eigene Zeile für jede Deklaration.
- Leerzeilen verwenden um semantisch zusammenhängende Anweisungsabschnitte zu trennen.
- Leerzeichen trennen semantische Einheiten innerhalb einer Codezeile. (Zwische Operanden eines Ausdrucks, aber nicht vor Klammern.
Reihenfolgekonventionen bei der Angabe von Klassenelementen?
- Paketdeklaration
- Importe (alphabetisch sortiert)
- Klassendeklaration und Vererbung
- Klassenvariablen und .konstanten
- Instanzvariablen
- Konstruktoren
- Getter & Setter
- Weitere Methoden.
Nützliche Methoden der Klasse Objekt? (Mutterklasse)
toString(): String
equals(obj: Object): boolean
hashCode(): int
clone(): Object
toString()?
Dient der Ausgabe von beliebig vielen Objektinhalten als Zeichenkette.
Wird die Methode nicht angeschrieben und an das gewünschte Ausgabeformat angepasst, so gibt sie stets den Namen der Klasse, gefolgt von einem Hashcode des Objekts aus.
Das Überschreiben bietet außerdem den Vorteil, dass wenn an einer Programmstelle ein String erwartet wird automatisch die toString()-Methode des Objekts aufgerufen wird.
"=="-Operator?
Vergleicht Objekte hinsichtlich ihrer Identität, nicht ihres Inhaltes. Dies ist bei primitive Datenytpen eine triviale Aufgabe, führt bei komplexen Datentypen nur zur booleanschen Ausgabe true, wenn die Referenz identisch ist. Also beide Datentypen auf dasselbe Objekt verweisen.
Werden also zwei komplexe Datentypen mit gleichem Inhalt in unterschiedlichen Objekten verglichen liefert dies als Rückgabe false.
Die Funktionsweise dieses Operators ist also unterschiedlich je nachdem ob man primitve oder komplexe Daatentypen vergleicht.
equals()?
Dient dem inhaltlichen Vergleich von Objekten. Muss in der Klasse überschrieben werden und in der Überschreibung muss festgelegt werden welche relevanten Daten der Objekte verglichen werden sollen.
Die Methode muss mit dem Abgleich if(this == obj) starten, um zu überprüfen ob bereits auf das gleiche Objekt referenziert wird. Anschließend muss mit dem instanceof-Operator geprüft werden, ob es sicht tatsächlich um Objekte derselben Klasse handelt. Anschließend kann der Vergleich anhand gewählter Attribute erfolgen.
Den Abschluss der Methode bildet die Anweisung return super.equals(obj). Hiermit wird die euqlas()-Methode der Oberklasse aufgerufen. Dies wird bis zum Aufruf der equals()-methode der Klasse Object fortgesetzt, diese unetrscheidet lediglich nurnoch anhand der Referenz.
Anforderungen an eine eigene equals()-Methode?
- Reflexiv: gleiche Objekte müssen immer true liefern
- Symmetrisch: Gleiches Ergebnis egal in welche Richtung verglichen wird, d.h. x.equals(y) muss das gleiche Ergebnis liefern wie y.equals(x)
- Transistiv: Sind zwei Objekte identisch und ein drittes identisch zu einem der beiden, so muss es automatisch identisch zum anderen Objekt sein.
- Konsistent: Solange die relevanten Attribute unverändert bleiben darf sich das Ergebnis nicht verändern.
- Existent: Existiert ein zu vergleichendes Objekt nicht muss der Vergleich immer zu false ausgewertet werden.
hashCode()-Methode?
Mithilfe eines Schlüssels, der das Objekt anhand seines Inhalts möglichst eindeutig indentifiziert wird ein Vergleich durchgeführt. Die Methode ist relativ schnell da nur der gehashte Code, also eine Ganzzahl, verglichen werden muss.
Eigene hashCode()-Implementierungen?
Müssen geschrieben werden wenn primitive Attribute verarbeitet werden sollen. Dabei sollten folgende Anforderungen erfüllt werden:
- Methode muss stabil sein => zwei inhaltlich gleiche Objekte sollten den gleichen Hashcode erzeugen.
- Die Berechnung muss zur equals-Methode passen, also die gleichen Attribute einbeziehen.
- Die Hash-Code sollten breit gestreut sein, d.h. nur wenige unterschiedliche Asttributbelegungen sollen den gleichen Hash-Wert erzeugen.
- Es sollten nur identitätsstiftende Attribute einbezogen werden.
compareTo()-Methode?
Wird genutzt um zu vergleichen ob Objekte zueinander größer, kleiner oder gleich sind. Möglichen Rückgaben sind nur die drei Möglichkeiten: Zahl größer null, gleich null oder kleiner null. Für etwaige Fehler, z.B. aufgrund eines falschen Datentyps sollte eine ClassCastException eingefügt werden, die vom aufrufenden Programm aufgefangen und behandelt werden muss.
Mithilfe von Generics lässt sich explizit ein Vergleich für einen bestimmten Typ implementieren.
Wrapper-Klassen?
Diese kapseln primitve Datentypen in Objekte, sodass sie wie Objekte behandelt werden können. Innnerhalb dieser Wrapper-Klassen gibt es zum Beispiel auch implementierte compareTo()-Methoden für Zahlentypen (int, float, double...) mithilfe derer ein einfaches Vergleichen ohne vorige Implementierung einer eigenen Methode ermöglicht wird.
Lexikographische Ordnung?
Ordnung von Objekten anhand ihrer Attribute. z.B. alphabetische Sortierung.
compareToIgnoreCasse() -> Spezielle compareTo()-Methode der Klasse String, die lexikographisch vergleicht und dabei Groß- und Kleinschreibung ignoriert.
Call-by-value?
Beschreibt einen Methodenaufruf bei dem die Parameterwerte als Kopien übergeben werden.
Call-by-Reference?
Beschreibt einen Methodenaufruf bei dem die Parameter als Verweis übergeben werden.
Möglichkeiten ein Objekt zu klonen?
- Definition eines Copy-Konstruktors
- Überschreiben den Methode clone()
clone()-methode?
Methode der Klasse Object, mit dem Sichtbarkeitsmodifikator protected. Überschreibende Klassen müssen das Interface Clonable implementieren, da die Methode sonst eine CloneNotSupportedException zurück wirft. Die Methode erzeugt ein neues geklontes Objekt, welches zurückgeliefert wird. Hierfür muss sie nicht über Art und Beschaffenheit der Attribute informiert werden. Es handelt sich jedoch um eine flache Kopie.
Flache/Tiefe Kopie?
- Flache Kopie:
- Enthält lediglich die Referenzen auf andere Objekte.
- Tiefe Kopie
- Schließt eine Kopie der referenzierten Objekte mit ein.
Debug-Ausgaben?
Dokumentieren den aktuellen Zustand z.B. von Objektattribute auf der Konsole oder in einer spezielle dafür vorgesehenen Log-Datei.
Logging-Bibliotheken?
Vereinfachen die Handhabung von Debug-Ausgaben im Quellcode. Legen fest was mit welcher Klasse von Fehlern in welcher Situation passieren soll. (Protokollieren oder nicht?)
Importieren fremder Bibliotheken?
- Download der Bibliothek
- Angabe welche Dateien relevant sind und extrahiert werden müssen findet sich für gewöhnlich in der bereit gestellten Dokumentation.
- Extraktion an beliebigen Ort.
- Hinzufügen zum Classpath (auch Buildpath genannt.)
- Nun kann die Bibliothek im Quellcode verwendet werden, um jedoch nicht in jeder Anweisung den vollen Namen der benötigten Klasse ausschreiben zu müssen sollte die Klasse oder das Paket in die aktuelle Klasse importiert werden.
Standard-Klassenbibliothek?
Sie unterstützt den Programmieren mit einer Vielzahl von nützlichen Klasse für die unterschiedlichsten, wiederkehrenden Programmieraufgaben. Sie ist bereits in die Laufzeitumgebung integriert und muss nicht dem Classpath hinzugefügt werden, aber dennoch für einzelne Klassen importiert werden.
Sie ist hierarchisch in Pakete gegliedert, die unterschiedlichen Einsatzzwecken zugeordnet sind, z.B. Programmierung grafischer Benutzerschnitstellen (GUIs), Netzwerkprogrammierung, Dateisystem & Datenströme, sowie häufig benötigte Datenstrukturen.
API-Dokumentation?
Dient als Nachschlagewerk das Aufschluss über bereitgestellte Bibliotheksfunktionen gibt (Paketstruktur, welche Klassen und welche Methoden.), sowie manchmal auch Anleitungen und Tutorials.
Klasse Scanner? (java.util)
Biete Funktionen zum Einlesen von Benutzereingaben auf der Konsole.
nextInt()-Methode? (Klasse Scanner)
Scannt das nächste Token einer Eingabe als Datentyp int.
Arrays?
Eine sehr einfach, in der Java Syntax eingebaute Möglichkeit Listen von Werten oder Objektreferenzen zu speichern. Die Elemente werden dabei sequenziell hintereinander in den Hauptspeicher geschrieben und werden mit einem Index versehen, welcher bei [0] beginnt und bei [n-1] aufhört, wenn das Array n Elemente hat.
Bei der Deklaration muss der Datentyp festgelegt werden, gefolgt von einer geöffneten und einer geschlossenen eckigen Klammen und dem Bezeichner.
Die Instanzierung wiederum ähnelt der von Objekten, jedoch werden erneut eckige Klammern verwendet und in diesen wird der Index angegeben.
Soll das Array auch noch initialisiert werden, so kann dies nur gemeinsam mit der Instanzierung geschehen. Hierzu müssen die Initialwerte in einer geschweiften Klammer aufgelistet werden.
length Attribut? (Arrays)
Gibt die Kapazität eines Arrays wieder, nicht die Anzahl seiner gespeicherten Elemente. Ist hilfreich wenn z.B. in einer Schleife alle Elemente eines Arrays bearbeitet werden sollen.
mehrdimensionale Arrays?
Verschachtelte Arrays, die Elemente eines Arrays sind also wiederum Arrays. Sie werden mit mehr als einem paar eckiger Klammern deklariert. (Ein 2 dimensionales Array ist zum Beispiel eine Matrix.)
Vor- und NAchteile von Arrays?
- Vorteile:
- unmittelbarer Bestandteil der Java-Syntax
- Kann beliebige Datentypen enthalten.
- Nachteile:
- Komplizierte Kapazitätenverwaltung (=> nur manuell)
- Hoher Aufwand beim Schließen von Lücken.
- Sehr begrenzte Funktionalität (=>hoher Programmieraufwand, falls sie als Stapel, Warteschlange oder Mengen verwendet werden sollen.
Zum Schließen dieser Lücken dienen die Datenstrukturen der Java-Klassenbibliothek.
Collections-Framework?
Fasst eine Menge von häufig benötigten Datenstrukturen und dazu passenenden Such- und Sortieralgorithmen zusammen. Die Gemeinsamkeiten der Collections werden im Interface Collection festgehalten und wird von allen Klassen des Frameworks, außer den Datenstrukturen zur Realisierung von Mengen, implementiert.
Hauptaufgabe besteht darin je nach Anwendungsfall Daten effizient zu speichern und einen genauso effizienten Zugriff auf sie zu ermöglichen. Je nach Implementierung wird ein anderer Schwerpunkt gelegt.
Collections können nur Referenzdatentypen speichern, keine primitiven, um das zu umgehen existieren Wrapper-Klassen.
Wichtigste Methoden des Interface Collections?
public interface Collection<E> extends Iterable<E> {
- boolean add(E e);
- fügt ein Objekt hinzu
- boolean remove (Object o);
- entfernt ein Objekt.
- int size();
- liefert Anzahl der Objekte zurück (nicht die Kapazität).
- boolean isEmpty();
- prüft ob Objekte enthalten sind.
- boolean contains(Object o);
- prüft ob ein bestimmtes Objekt enthalten ist.
- void clear();
- entfernt alle Objekt der Collection
- Iterator<E> iterator();
- liefert den Iterator zurück
- Object[] toArray();
- liefert die Collection als einfaches Array zurück
}
Iterator?
Unterstützt den Programmierer beim Durchlaufen von Elementen einer Collection. Es ist vorgesehen das jede Collection einen Iterator implementiert, um dies sicher zu stellen wurde das Interface Iterable eingeführt, welches lediglich die Methode iterator() enthaält und vom Collection Interface erweitert wird. So wird sichergestellt das jede Klasse die eine Collection implementiert auch einen Iterator anbietet.
Ein Iterator besitzt 3 Methoden:
- hasNext() (prüft ob es nachfolgende Elemente gibt.)
- next() (positioniert sich auf dem nächsten Element und gibt diese zurück.)
- remove() (entfernt das Element auf dem der Iterator aktuell steht.)
Ein Iterator kann statt eines Laufindex innerhalb einer for-Schleife verwendet werden. Hierzu gibt es auch die Möglichkeit die erweiterte for-Schleife zu verwenden, welche lediglich ein Stellvertreter-Objekt für alle Elemente und die zu durchlaufende Collection im Kopf benötigt.