Sie befinden sich hier: Home » Wissenstransfer » Java ist auch eine Insel » Online-Ausgabe

Die ›Insel‹ in der 7. Auflage online

Vorwort

Vorwort zur 6. Auflage
Vorwort zur 7. Auflage

1 Java ist auch eine Sprache

1.1 Der erste Kontakt
1.2 Historischer Hintergrund
1.3 Eigenschaften von Java
1.3.1 Bytecode und die virtuelle Maschine
1.3.2 Objektorientierung in Java
1.3.3 Java-Security-Modell
1.3.4 Zeiger und Referenzen
1.3.5 Bring den Müll raus, Garbage-Collector!
1.3.6 Ausnahmebehandlung
1.3.7 Kein Präprozessor für Textersetzungen
1.3.8 Keine überladenen Operatoren
1.3.9 Java als Sprache, Laufzeitumgebung und Bibliothek
1.3.10 Wofür sich Java nicht eignet
1.3.11 Java im Vergleich zu anderen Sprachen
1.3.12 Java ist Open Source
1.4 Die Rolle von Java im Web
1.4.1 Vollwertige Applikationen statt Applets
1.5 Die Java Platform Standard Edition (Java SE)
1.5.1 JDK und JRE
1.5.2 Java-Versionen
1.5.3 Java für die Kleinen
1.5.4 Java für die Großen
1.5.5 Installationsanleitung für Java SE
1.6 Das erste Programm compilieren und testen
1.6.1 Ein Quadratzahlen-Programm
1.6.2 Der Compilerlauf
1.6.3 Die Laufzeitumgebung
1.6.4 Häufige Compiler- und Interpreterprobleme
1.7 Entwicklungsumgebungen im Allgemeinen
1.7.1 Die Entwicklungsumgebung Eclipse
1.7.2 NetBeans von Sun
1.7.3 Ein Wort zu Microsoft, Java und zu J++
1.8 Eclipse im Speziellen
1.8.1 Eclipse starten
1.8.2 Das erste Projekt anlegen
1.8.3 Eine Klasse hinzufügen
1.8.4 Übersetzen und Ausführen
1.8.5 JDK statt JRE
1.8.6 Start eines Programms ohne Speicheraufforderung
1.8.7 Projekt einfügen oder Workspace für die Aufgaben wechseln
1.8.8 Plugins für Eclipse
1.8.9 Eclipse Web Tools Platform (WTP)
1.9 Zum Weiterlesen

2 Sprachbeschreibung

2.1 Elemente der Programmiersprache Java
2.1.1 Textkodierung durch Unicode-Zeichen
2.1.2 Literale
2.1.3 Bezeichner
2.1.4 Reservierte Schlüsselwörter
2.1.5 Token
2.1.6 Kommentare
2.2 Anweisungen formen Programme
2.2.1 Anweisungen
2.2.2 Eine Klasse bildet den Rahmen
2.2.3 Die Reise beginnt am main()
2.2.4 Programme übersetzen und starten
2.2.5 Funktionsaufrufe als Ausdrücke und Anweisungen
2.2.6 print(), println() und printf() für Bildschirmausgaben
2.2.7 Modifizierer
2.2.8 Anweisungen und Blöcke
2.3 Datentypen
2.3.1 Primitive Datentypen im Überblick
2.3.2 Wahrheitswerte
2.3.3 Variablendeklarationen
2.3.4 Ganzzahlige Datentypen
2.3.5 Die Fließkommazahlen float und double
2.3.6 Alphanumerische Zeichen
2.4 Ausdrücke, Operanden und Operatoren
2.4.1 Zuweisungsoperator
2.4.2 Arithmetische Operatoren
2.4.3 Unäres Minus und Plus
2.4.4 Zuweisung mit Operation
2.4.5 Präfix- oder Postfix-Inkrement und -Dekrement
2.4.6 Die relationalen Operatoren und die Gleichheitsoperatoren
2.4.7 Logische Operatoren Und, Oder, Xor, Nicht
2.4.8 Rang der Operatoren in der Auswertungsreihenfolge
2.4.9 Die Typanpassung (das Casting)
2.4.10 Überladenes Plus für Strings
2.4.11 Was C(++)-Programmierer vermissen könnten
2.5 Bedingte Anweisungen oder Fallunterscheidungen
2.5.1 Die if-Anweisung
2.5.2 Die Alternative mit einer if/else-Anweisung wählen
2.5.3 Die switch-Anweisung bietet die Alternative
2.6 Schleifen
2.6.1 Die while-Schleife
2.6.2 Schleifenbedingungen und Vergleiche mit ==
2.6.3 Die do-while-Schleife
2.6.4 Die for-Schleife
2.6.5 Ausbruch planen mit break und Wiedereinstieg mit continue
2.6.6 break und continue mit Sprungmarken
2.7 Methoden einer Klasse
2.7.1 Bestandteil einer Funktion
2.7.2 Beschreibungen in der Java-API
2.7.3 Aufruf einer Methode
2.7.4 Methoden ohne Parameter
2.7.5 Statische Funktionen (Klassenmethoden)
2.7.6 Parameter, Argument und Wertübergabe
2.7.7 Methoden vorzeitig mit return beenden
2.7.8 Nicht erreichbarer Quellcode bei Funktionen
2.7.9 Rückgabewerte
2.7.10 Methoden überladen
2.7.11 Vorgegebener Wert für nicht aufgeführte Argumente
2.7.12 Finale lokale Variablen
2.7.13 Rekursive Funktionen
2.7.14 Die Türme von Hanoi
2.8 Weitere Operatoren
2.8.1 Bits und Bytes
2.8.2 Operationen auf Bit-Ebene
2.8.3 Die Verschiebeoperatoren
2.8.4 Ein Bit setzen, löschen, umdrehen und testen
2.8.5 Bit-Funktionen der Integer- und Long-Klasse
2.8.6 Der Bedingungsoperator
2.9 Einfache Benutzereingaben
2.10 Zum Weiterlesen

3 Klassen und Objekte

3.1 Objektorientierte Programmierung
3.1.1 Warum überhaupt OOP?
3.1.2 Wiederverwertbarkeit
3.2 Eigenschaften einer Klasse
3.2.1 Die Klasse Point
3.3 Die UML (Unified Modeling Language)
3.3.1 Hintergrund und Geschichte zur UML
3.3.2 Wichtige Diagrammtypen der UML
3.4 Neue Objekte erzeugen
3.4.1 Anlegen eines Exemplars einer Klasse mit dem new-Operator
3.4.2 Deklarieren von Referenzvariablen
3.4.3 Zugriff auf Variablen und Methoden mit dem ».«
3.4.4 Konstruktoren nutzen
3.4.5 Die API-Dokumentation
3.5 Import und Pakete
3.6 Mit Referenzen arbeiten
3.6.1 Die null-Referenz
3.6.2 Zuweisungen bei Referenzen
3.6.3 Funktionen mit nicht-primitiven Parametern
3.7 Identität und Gleichheit
3.7.1 Identität von Objekten
3.7.2 Gleichheit und die Methode equals()
3.8 Wrapper-Klassen und Autoboxing
3.8.1 Die Basisklasse Number für numerische Wrapper-Objekte
3.8.2 Die Klasse Integer
3.8.3 Unterschiedliche Ausgabeformate
3.8.4 Autoboxing: Boxing und Unboxing
3.8.5 Die Boolean-Klasse
3.8.6 Die Klassen Double und Float für Fließkommazahlen
3.9 Arrays
3.9.1 Deklaration von Arrays
3.9.2 Arrays mit Inhalt
3.9.3 Die Länge eines Arrays über das Attribut length
3.9.4 Zugriff auf die Elemente über den Index
3.9.5 Array-Objekte erzeugen
3.9.6 Fehler bei Arrays
3.9.7 Vorinitialisierte Arrays
3.9.8 Die erweiterte for-Schleife
3.9.9 Arrays mit nicht-primitiven Elementen
3.9.10 Mehrdimensionale Arrays
3.9.11 Die Wahrheit über die Array-Initialisierung
3.9.12 Mehrere Rückgabewerte
3.9.13 Methode mit variabler Argumentanzahl (Vararg)
3.9.14 Klonen kann sich lohnen – Arrays vermehren
3.9.15 Feldinhalte kopieren
3.9.16 Die Klasse Arrays zum Vergleichen, Füllen und Suchen
3.10 Der Einstiegspunkt für das Laufzeitsystem main()
3.10.1 Kommandozeilen-Argumente verarbeiten
3.10.2 Der Rückgabewert von main() und System.exit()
3.11 Eigene Pakete schnüren
3.11.1 Die package-Anweisung
3.11.2 Importieren von Klassen mit import
3.11.3 Hierarchische Strukturen und das Default-Package
3.11.4 Paketnamen
3.11.5 Klassen mit gleichen Namen in unterschiedlichen Paketen
3.11.6 Statisches Import
3.11.7 Eine Verzeichnisstruktur für eigene Projekte
3.12 Zum Weiterlesen

4 Der Umgang mit Zeichenketten

4.1 Einzelne Zeichen mit der Character-Klasse behandeln
4.2 Strings und deren Anwendung
4.2.1 String-Literale als String-Objekte für konstante Zeichenketten
4.2.2 String-Länge und Test auf Leerstring
4.2.3 Nach enthaltenen Zeichen und Zeichenfolgen suchen
4.2.4 Gut, dass wir verglichen haben
4.2.5 String-Teile extrahieren
4.2.6 Strings anhängen, Groß-/Kleinschreibung und Leerraum
4.2.7 Suchen und ersetzen
4.2.8 String-Objekte mit Konstruktoren neu anlegen
4.3 Konvertieren zwischen Primitiven und Strings
4.3.1 Unterschiedliche Typen in Zeichenketten konvertieren
4.3.2 String in primitives Element konvertieren
4.4 Veränderbare Zeichenketten mit StringBuffer/StringBuilder
4.4.1 Anlegen von StringBuffer/StringBuilder-Objekten
4.4.2 Die Länge eines StringBuffer/-Builder-Objekts
4.4.3 Daten anhängen
4.4.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
4.4.5 Vergleichen von String/StringBuffer/StringBuilder
4.4.6 hashCode() bei StringBuffer/StringBuilder
4.5 Sprachabhängiges Vergleichen und Normalisierung
4.5.1 Die Klasse Collator
4.5.2 Effiziente interne Speicherung für die Sortierung
4.5.3 Normalisierung
4.6 Reguläre Ausdrücke
4.6.1 Die Klassen Pattern und Matcher
4.6.2 Mit MatchResult alle Ergebnisse einsammeln
4.7 Zerlegen von Zeichenketten
4.7.1 Splitten von Zeichenketten mit split()
4.7.2 split() in Pattern
4.7.3 Die Klasse Scanner
4.7.4 StringTokenizer
4.7.5 BreakIterator als Zeichen-, Wort-, Zeilen- und Satztrenner
4.8 Zeichenkodierungen und Base64
4.8.1 Über die Klasse String Kodierungen vornehmen
4.8.2 Konvertieren mit OutputStreamWriter-Klassen
4.8.3 Das Paket java.nio.charset
4.8.4 Base64-Kodierung
4.9 Formatieren von Ausgaben
4.9.1 Formatieren mit format() aus String
4.9.2 Die Format-Klassen im Überblick
4.9.3 Zahlen, Prozente und Währungen mit NumberFormat und DecimalFormat formatieren
4.9.4 Ausgaben mit MessageFormat formatieren
4.10 Zum Weiterlesen

5 Mathematisches

5.1 Repräsentation ganzer Zahlen – das Zweierkomplement
5.2 Fließkommaarithmetik in Java
5.2.1 Mantisse und Exponent
5.2.2 Spezialwerte Unendlich, Null, NaN
5.3 Wertebereich eines Typs und Überlaufkontrolle
5.3.1 Behandlung des Überlaufs
5.4 Die Eigenschaften der Klasse Math
5.4.1 Attribute
5.4.2 Absolutwerte und Maximum/Minimum
5.4.3 Winkelfunktionen
5.4.4 Runden von Werten
5.4.5 Wurzel und Exponentialfunktionen
5.4.6 Der Logarithmus
5.4.7 Rest der ganzzahligen Division
5.4.8 Zufallszahlen
5.5 Mathe bitte strikt
5.5.1 Strikt Fließkomma mit strictfp
5.5.2 Die Klassen Math und StrictMath
5.6 Die Random-Klasse
5.6.1 Objekte aufbauen und der Seed
5.6.2 Zufallszahlen erzeugen
5.6.3 Pseudo-Zufallszahlen in der Normalverteilung
5.7 Große Zahlen
5.7.1 Die Klasse BigInteger
5.7.2 Funktionen von BigInteger
5.7.3 Ganz lange Fakultäten
5.7.4 Große Fließkommazahlen mit BigDecimal
5.7.5 Mit MathContext komfortabel die Rechengenauigkeit setzen
5.8 Zum Weiterlesen

6 Eigene Klassen schreiben

6.1 Eigene Klassen mit Eigenschaften deklarieren
6.1.1 Attribute deklarieren
6.1.2 Methoden deklarieren
6.1.3 Die this-Referenz
6.2 Privatsphäre und Sichtbarkeit
6.2.1 Für die Öffentlichkeit: public
6.2.2 Paketsichtbar
6.2.3 Kein Public Viewing – Passwörter sind privat
6.2.4 Wieso nicht freie Methoden und Variablen für alle?
6.2.5 Privat ist nicht ganz privat: Es kommt darauf an, wer’s sieht
6.2.6 Zugriffsmethoden für Attribute deklarieren
6.2.7 Setter und Getter nach der JavaBeans-Spezifikation
6.3 Statische Methoden und statische Attribute
6.3.1 Warum statische Eigenschaften sinnvoll sind
6.3.2 Statische Eigenschaften mit static
6.3.3 Statische Eigenschaften über Referenzen nutzen?
6.3.4 Warum die Groß- und Kleinschreibung wichtig ist
6.3.5 Statische Eigenschaften und Objekteigenschaften
6.3.6 Statische Variablen zum Datenaustausch
6.3.7 Statische Blöcke als Klasseninitialisierer
6.4 Konstanten und Aufzählungen
6.4.1 Konstanten über öffentliche statische finale Variablen
6.4.2 Eincompilierte Belegungen der Klassenvariablen
6.4.3 Typ(un)sicherere Aufzählungen
6.4.4 Aufzählungen mit enum
6.5 Objekte anlegen und zerstören
6.5.1 Konstruktoren schreiben
6.5.2 Der Standard-Konstruktor
6.5.3 Parametrisierte und überladene Konstruktoren
6.5.4 Konstruktor nimmt ein Objekt vom eigenen Typ an (Copy-Konstruktor)
6.5.5 Einen anderen Konstruktor der gleichen Klasse aufrufen
6.5.6 Initialisierung der Objekt- und Klassenvariablen
6.5.7 Finale Werte im Konstruktor und in statischen Blöcken setzen
6.5.8 Exemplarinitialisierer (Instanzinitialisierer)
6.5.9 Ihr fehlt uns nicht – der Garbage-Collector
6.5.10 Implizit erzeugte String-Objekte
6.5.11 Private Konstruktoren, Utility-Klassen, Singleton, Fabriken
6.6 Assoziationen zwischen Objekten
6.6.1 Unidirektionale 1:1-Beziehung
6.6.2 Bidirektionale 1:1-Beziehungen
6.6.3 Unidirektionale 1:n-Beziehung
6.7 Vererbung
6.7.1 Vererbung in Java
6.7.2 Spielobjekte modelliert
6.7.3 Einfach- und Mehrfachvererbung
6.7.4 Sichtbarkeit protected
6.7.5 Konstruktoren in der Vererbung und super
6.7.6 Automatische und explizite Typanpassung
6.7.7 Das Substitutionsprinzip
6.7.8 Typen mit dem binären Operator instanceof testen
6.7.9 Methoden überschreiben
6.7.10 Mit super an die Eltern
6.7.11 Kovariante Rückgabetypen
6.7.12 Array-Typen und Kovarianz
6.7.13 Zusammenfassung zur Sichtbarkeit
6.8 Dynamisches Binden
6.8.1 Unpolymorph bei privaten, statischen und finalen Methoden
6.8.2 Polymorphie bei Konstruktoraufrufen
6.8.3 Finale Klassen
6.8.4 Nicht überschreibbare (finale) Methoden
6.9 Abstrakte Klassen und abstrakte Methoden
6.9.1 Abstrakte Klassen
6.9.2 Abstrakte Methoden
6.10 Schnittstellen
6.10.1 Deklarieren von Schnittstellen
6.10.2 Implementieren von Schnittstellen
6.10.3 Markierungsschnittstellen
6.10.4 Ein Polymorphie-Beispiel mit Schnittstellen
6.10.5 Die Mehrfachvererbung bei Schnittstellen
6.10.6 Keine Kollisionsgefahr bei Mehrfachvererbung
6.10.7 Erweitern von Interfaces – Subinterfaces
6.10.8 Vererbte Konstanten bei Schnittstellen
6.10.9 Schnittstellenmethoden, die nicht implementiert werden müssen
6.10.10 Abstrakte Klassen und Schnittstellen im Vergleich
6.11 Geschachtelte (innere) Klassen, Schnittstellen, Aufzählungen
6.11.1 Statische innere Klassen und Schnittstellen
6.11.2 Mitglieds- oder Elementklassen
6.11.3 Lokale Klassen
6.11.4 Anonyme innere Klassen
6.11.5 this und Vererbung
6.12 Generische Datentypen
6.12.1 Einfache Klassenschablonen
6.12.2 Einfache Methodenschablonen
6.12.3 Umsetzen der Generics, Typlöschung und Raw-Types
6.12.4 Einschränken der Typen
6.12.5 Generics und Vererbung, Invarianz
6.12.6 Wildcards
6.13 Die Spezial-Oberklasse Enum
6.13.1 Methoden auf Enum-Objekten
6.13.2 enum mit eigenen Konstruktoren und Methoden
6.14 Dokumentationskommentare mit JavaDoc
6.14.1 Einen Dokumentationskommentar setzen
6.14.2 Mit javadoc eine Dokumentation erstellen
6.14.3 HTML-Tags in Dokumentationskommentaren
6.14.4 Generierte Dateien
6.14.5 Dokumentationskommentare im Überblick
6.14.6 JavaDoc und Doclets
6.14.7 Veraltete (deprecated) Klassen, Konstruktoren und Methoden

7 Angewandte Objektorientierung

7.1 Schnittstellen in der Anwendung
7.1.1 CharSequence als Beispiel einer Schnittstelle
7.1.2 Die Schnittstelle Iterable
7.1.3 Funktionszeiger
7.1.4 Implementierung einer verketteten Liste
7.2 Design-Pattern (Entwurfsmuster)
7.2.1 Design-Pattern
7.2.2 Das Beobachter-Pattern (Observer/Observable)
7.2.3 Ereignisse über Listener
7.2.4 Multicast und Unicast
7.3 JavaBean
7.3.1 Properties (Eigenschaften)
7.3.2 Einfache Eigenschaften
7.3.3 Indizierte Eigenschaften
7.3.4 Gebundene Eigenschaften
7.3.5 Veto-Eigenschaften – dagegen!

8 Exceptions

8.1 Problembereiche einzäunen
8.1.1 Exceptions in Java mit try und catch
8.1.2 Eine Datei mit RandomAccessFile auslesen
8.1.3 Ablauf einer Ausnahmesituation
8.1.4 Wiederholung abgebrochener Bereiche
8.1.5 throws im Methodenkopf angeben
8.1.6 Abschlussbehandlung mit finally
8.1.7 Nicht erreichbare catch-Klauseln
8.2 Die Klassenhierarchie der Fehler
8.2.1 Die Exception-Hierarchie
8.2.2 Oberausnahmen auffangen
8.2.3 Alles geht als Exception durch
8.2.4 RuntimeException muss nicht aufgefangen werden
8.2.5 Harte Fehler: Error
8.3 Auslösen eigener Exceptions
8.3.1 Mit throw Ausnahmen auslösen
8.3.2 Neue Exception-Klassen deklarieren
8.3.3 Abfangen und Weiterleiten
8.3.4 Geschachtelte Ausnahmen
8.3.5 Rückgabewerte bei ausgelösten Ausnahmen
8.4 Der Stack-Trace
8.4.1 Stack-Trace erfragen
8.5 Assertions
8.5.1 Assertions in eigenen Programmen nutzen
8.5.2 Assertions aktivieren

9 Die Funktionsbibliothek

9.1 Die Java-Klassenphilosophie
9.1.1 Übersicht über die Pakete der Standardbibliothek
9.2 Object ist die Mutter aller Oberklassen
9.2.1 Klassenobjekte
9.2.2 Objektidentifikation mit toString()
9.2.3 Objektgleichheit mit equals() und Identität
9.2.4 Klonen eines Objekts mit clone()
9.2.5 Hashcodes über hashCode() liefern
9.2.6 Aufräumen mit finalize()
9.2.7 Synchronisation
9.3 Klassenlader (Class Loader)
9.3.1 Woher die kleinen Klassen kommen
9.3.2 Setzen des Klassenpfades
9.3.3 Die wichtigsten drei Typen von Klassenladern
9.3.4 Der java.lang.ClassLoader
9.3.5 Hot Deployment mit dem URL-ClassLoader
9.3.6 Das jre/lib/endorsed-Verzeichnis
9.3.7 getContextClassLoader() vom Thread
9.4 Die Utility-Klasse System und Properties
9.4.1 Systemeigenschaften der Java-Umgebung
9.4.2 line.separator
9.4.3 Browser-Version abfragen
9.4.4 Property von der Konsole aus setzen
9.4.5 Umgebungsvariablen des Betriebssystems
9.4.6 Einfache Zeitmessung und Profiling
9.5 Ausführen externer Programme und Skripte
9.5.1 ProcessBuilder und Prozesskontrolle mit Process
9.5.2 Einen Browser/E-Mail-Client/Editor aufrufen
9.5.3 Ausführen von Skripten
9.6 Benutzereinstellungen
9.6.1 Benutzereinstellungen in Windows-Registry oder XML-Dokumenten
9.6.2 Einträge einfügen, auslesen und löschen
9.6.3 Auslesen der Daten und Schreiben in anderem Format
9.6.4 Auf Ereignisse horchen
9.6.5 Zugriff auf die gesamte Windows-Registry
9.7 Musik abspielen
9.7.1 Die Arbeit mit AudioClip
9.7.2 Java Sound API
9.8 Annotationen
9.8.1 Annotationstypen
9.8.2 Common Annotations
9.8.3 Annotationen für Web-Services
9.8.4 Annotationen für XML-Mapping
9.9 Zum Weiterlesen

10 Threads und nebenläufige Programmierung

10.1 Nebenläufigkeit
10.1.1 Threads und Prozesse
10.1.2 Wie parallele Programme die Geschwindigkeit steigern können
10.1.3 Was Java für Nebenläufigkeit alles bietet
10.2 Threads erzeugen
10.2.1 Threads über die Schnittstelle Runnable implementieren
10.2.2 Thread mit Runnable starten
10.2.3 Der Name eines Threads
10.2.4 Die Klasse Thread erweitern
10.2.5 Wer bin ich?
10.3 Die Zustände eines Threads
10.3.1 Threads schlafen
10.3.2 Mit yield() auf Rechenzeit verzichten
10.3.3 Das Ende eines Threads
10.3.4 UncaughtExceptionHandler für unbehandelte Ausnahmen
10.3.5 Einen Thread höflich mit Interrupt beenden
10.3.6 Der stop() von außen und die Rettung mit ThreadDeath
10.3.7 Ein Rendezvous mit join()
10.3.8 Barrier und Austausch mit Exchanger
10.3.9 Arbeit niederlegen und wieder aufnehmen
10.3.10 Priorität
10.3.11 Der Thread ist ein Dämon
10.4 Der Ausführer (Executor) kommt
10.4.1 Die Schnittstelle Executor
10.4.2 Die Thread-Pools
10.4.3 Threads mit Rückgabe über Callable
10.4.4 Mehrere Callable abarbeiten
10.4.5 Mit ScheduledExecutorService wiederholende Ausgaben und Zeitsteuerungen
10.5 Synchronisation über kritische Abschnitte
10.5.1 Gemeinsam genutzte Daten
10.5.2 Probleme beim gemeinsamen Zugriff und kritische Abschnitte
10.5.3 Punkte parallel initialisieren
10.5.4 i++ sieht atomar aus, ist es aber nicht
10.5.5 Kritische Abschnitte schützen
10.5.6 Schützen mit ReentrantLock
10.5.7 Synchronisieren mit synchronized
10.5.8 Synchronized-Methoden der Klasse StringBuffer
10.5.9 Mit synchronized synchronisierte Blöcke
10.5.10 Dann machen wir doch gleich alles synchronisiert!
10.5.11 Lock-Freigabe im Fall von Exceptions
10.5.12 Mit synchronized nachträglich synchronisieren
10.5.13 Monitore sind reentrant – gut für die Geschwindigkeit
10.5.14 Synchronisierte Methodenaufrufe zusammenfassen
10.5.15 Deadlocks
10.6 Synchronisation über Warten und Benachrichtigen
10.6.1 Die Schnittstelle Condition
10.6.2 Beispiel: Erzeuger-Verbraucher-Programm
10.6.3 Warten mit wait() und Aufwecken mit notify()
10.6.4 Falls der Lock fehlt: IllegalMonitorStateException
10.6.5 Semaphor
10.7 Atomare Operationen und frische Werte mit volatile
10.7.1 Der Modifizierer volatile bei Objekt-/Klassenvariablen
10.7.2 Das Paket java.util.concurrent.atomic
10.8 Mit dem Thread verbundene Variablen
10.8.1 ThreadLocal
10.8.2 InheritableThreadLocal
10.9 Gruppen von Threads in einer Thread-Gruppe
10.9.1 Aktive Threads in der Umgebung
10.9.2 Etwas über die aktuelle Thread-Gruppe herausfinden
10.9.3 Threads in einer Thread-Gruppe anlegen
10.9.4 Methoden von Thread und ThreadGroup im Vergleich
10.10 Zeitgesteuerte Abläufe
10.10.1 Die Klassen Timer und TimerTask
10.10.2 Job-Scheduler Quartz
10.11 Einen Abbruch der virtuellen Maschine erkennen
10.12 Zum Weiterlesen

11 Raum und Zeit

11.1 Weltzeit
11.2 Wichtige Datum-Klassen im Überblick
11.3 Sprachen der Länder
11.3.1 Sprachen und Regionen über Locale-Objekte
11.4 Internationalisierung und Lokalisierung
11.4.1 ResourceBundle-Objekte und Ressource-Dateien
11.4.2 Ressource-Dateien zur Lokalisierung
11.4.3 Die Klasse ResourceBundle
11.4.4 Ladestrategie für ResourceBundle-Objekte
11.5 Zeitzonen
11.5.1 Zeitzonen durch die Klasse TimeZone repräsentieren
11.6 Die Klasse Date
11.6.1 Objekte erzeugen und Methoden nutzen
11.7 Calendar und GregorianCalendar
11.7.1 Die abstrakte Klasse Calendar
11.7.2 Der gregorianische Kalender
11.7.3 Ostertage
11.7.4 Abfragen und Setzen von Datumselementen
11.8 Formatieren und Parsen von Datumsangaben
11.8.1 Ausgaben mit printf()
11.8.2 Mit DateFormat und SimpleDateFormat formatieren
11.8.3 Parsen von Datumswerten
11.9 Zum Weiterlesen

12 Datenstrukturen und Algorithmen

12.1 Datenstrukturen und die Collection-API
12.1.1 Designprinzip mit Schnittstellen, abstrakten Klassen, konkreten Klassen
12.1.2 Die Basis-Schnittstellen Collection und Map
12.1.3 Das erste Programm mit Container-Klassen
12.1.4 Die Schnittstelle Collection
12.1.5 Schnittstellen, die Collection erweitern, und Map
12.1.6 Konkrete Container-Klassen
12.1.7 Welche Klasse nehmen?
12.1.8 Generische Datentypen in der Collection-API
12.1.9 Die Schnittstelle Iterable und das erweiterte for
12.2 Mit einem Iterator durch die Daten wandern
12.2.1 Die Schnittstellen Enumeration und Iterator
12.2.2 Iteratoren von Sammlungen und das erweiterte for
12.2.3 Fail-Fast Iterator und die ConcurrentModificationException
12.3 Listen
12.3.1 ArrayList oder LinkedList? Speicherung im Feld oder in einer verketteten Liste
12.3.2 Die Schnittstelle List
12.3.3 ArrayList
12.3.4 LinkedList
12.3.5 Der Feld-Adapter Arrays.asList()
12.3.6 toArray() von Collection verstehen – die Gefahr einer Falle erkennen
12.3.7 Primitive Elemente in den Collection-Datenstrukturen
12.4 Vergleichen von Objekten
12.4.1 Die Schnittstellen Comparator und Comparable
12.4.2 Algorithmen mit Such- und Sortiermöglichkeiten
12.4.3 Den größten und kleinsten Wert einer Collection finden
12.4.4 Sortieren
12.5 Mengen (Sets)
12.5.1 HashSet
12.5.2 TreeSet – die Menge durch Bäume
12.5.3 LinkedHashSet
12.6 Stack (Kellerspeicher, Stapel)
12.6.1 Die Methoden von Stack
12.6.2 Ein Stack ist ein Vector – aha!
12.7 Queues (Schlangen) und Deques
12.7.1 Die Schnittstelle Queue
12.7.2 Blockierende Queues und Prioritätswarteschlangen
12.7.3 Deque-Klassen
12.8 Assoziative Speicher
12.8.1 Die Klassen HashMap und TreeMap
12.8.2 Einfügen und Abfragen der Datenstruktur
12.8.3 Die Bedeutung von equals(), hashCode() und IdentityHashMap
12.8.4 Elemente im Assoziativspeicher müssen unveränderbar bleiben
12.8.5 Aufzählungen und Sichten auf den Assoziativspeicher
12.8.6 Der Gleichheitstest, Hash-Wert und Klon einer Hash-Tabelle
12.8.7 Die Arbeitsweise einer Hash-Tabelle
12.8.8 Multi-Maps
12.9 Die Properties-Klasse
12.9.1 Properties setzen und lesen
12.9.2 Properties verketten
12.9.3 Eigenschaften ausgeben
12.9.4 Hierarchische Eigenschaften
12.9.5 Properties speichern
12.9.6 Klassenbeziehungen: Properties und Hashtable
12.10 Algorithmen in Collections
12.10.1 Listenoperationen: Ersetzen, Kopieren, Füllen, Umdrehen, Rotieren, Durchmischen
12.10.2 Mit der Halbierungssuche nach Elementen fahnden
12.10.3 Nicht-änderbare Datenstrukturen
12.10.4 Häufigkeit eines Elements
12.10.5 nCopies()
12.10.6 Singletons
12.11 Synchronisation der Datenstrukturen
12.11.1 Lock-Free-Algorithmen aus java.util.concurrent
12.11.2 Wrapper zur Synchronisation
12.11.3 CopyOnWriteArrayList und CopyOnWriteArraySet
12.12 Die Klasse BitSet für Bitmengen
12.12.1 Ein BitSet anlegen, füllen und erfragen
12.12.2 Mengenorientierte Operationen
12.12.3 Funktionsübersicht
12.12.4 Primzahlen in einem BitSet verwalten

13 Dateien und Datenströme

13.1 Datei und Verzeichnis
13.1.1 Dateien und Verzeichnisse mit der Klasse File
13.1.2 Verzeichnis oder Datei? Existiert es?
13.1.3 Verzeichnis- und Dateieigenschaften/-attribute
13.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
13.1.5 Umbenennen und Verzeichnisse anlegen
13.1.6 Verzeichnisse listen und Dateien filtern
13.1.7 Dateien berühren, neue Dateien anlegen, temporäre Dateien
13.1.8 Dateien und Verzeichnisse löschen
13.1.9 Verzeichnisse nach Dateien iterativ durchsuchen
13.1.10 URL- und URI-Objekte aus einem File-Objekt ableiten
13.1.11 Mit Locking Dateien sperren
13.1.12 Sicherheitsprüfung
13.1.13 Mime-Typen mit dem JavaBeans Activation Framework (JAF)
13.1.14 Zugriff auf SMB-Server mit jCIFS
13.2 Dateien mit wahlfreiem Zugriff
13.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
13.2.2 Aus dem RandomAccessFile lesen
13.2.3 Schreiben mit RandomAccessFile
13.2.4 Die Länge des RandomAccessFile
13.2.5 Hin und her in der Datei
13.2.6 Wahlfreier Zugriff und Pufferung mit Unified I/O
13.3 Stream-Klassen und Reader/Writer am Beispiel von Dateien
13.3.1 Mit dem FileWriter Texte in Dateien schreiben
13.3.2 Zeichen mit der Klasse FileReader lesen
13.3.3 Kopieren mit FileOutputStream und FileInputStream
13.3.4 Das FileDescriptor-Objekt
13.4 Basisklassen für die Ein-/Ausgabe
13.4.1 Die abstrakten Basisklassen
13.4.2 Übersicht über Ein-/Ausgabeklassen
13.4.3 Die abstrakte Basisklasse OutputStream
13.4.4 Die Schnittstellen Closeable und Flushable
13.4.5 Ein Datenschlucker
13.4.6 Die abstrakte Basisklasse InputStream
13.4.7 Ressourcen wie Grafiken aus dem Klassenpfad und aus Jar–Archiven laden
13.4.8 Ströme mit SequenceInputStream zusammensetzen
13.4.9 Die abstrakte Basisklasse Writer
13.4.10 Die Schnittstelle Appendable
13.4.11 Die abstrakte Basisklasse Reader
13.5 Formatierte Textausgaben
13.5.1 Die Klassen PrintWriter und PrintStream
13.5.2 System.out, System.err und System.in
13.5.3 Geschützte Passwort-Eingaben mit der Klasse Console
13.6 Schreiben und Lesen aus Strings und Byte-Feldern
13.6.1 Mit dem StringWriter ein String-Objekt füllen
13.6.2 CharArrayWriter
13.6.3 StringReader und CharArrayReader
13.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
13.6.5 Mit ByteArrayInputStream aus einem Byte-Feld lesen
13.7 Datenströme filtern und verketten
13.7.1 Streams als Filter verketten
13.7.2 Gepufferte Ausgaben mit BufferedWriter und BufferedOutputStream
13.7.3 Gepufferte Eingaben mit BufferedReader und BufferedInputStream
13.7.4 LineNumberReader zählt automatisch Zeilen mit
13.7.5 Daten mit der Klasse PushbackReader zurücklegen
13.7.6 DataOutputStream/DataInputStream
13.7.7 Basisklassen für Filter
13.7.8 Die Basisklasse FilterWriter
13.7.9 Ein LowerCaseWriter
13.7.10 Eingaben mit der Klasse FilterReader filtern
13.8 Vermittler zwischen Byte-Streams und Unicode-Strömen
13.8.1 Datenkonvertierung durch den OutputStreamWriter
13.8.2 Automatische Konvertierungen mit dem InputStreamReader
13.9 Kommunikation zwischen Threads mit Pipes
13.9.1 PipedOutputStream und PipedInputStream
13.9.2 PipedWriter und PipedReader
13.10 Datenkompression
13.10.1 Java-Unterstützung beim Komprimieren und Zusammenpacken
13.10.2 Datenströme komprimieren
13.10.3 Zip-Archive
13.10.4 Jar-Archive
13.11 Prüfsummen
13.11.1 Die Schnittstelle Checksum
13.11.2 Die Klasse CRC32
13.11.3 Die Adler32-Klasse
13.12 Persistente Objekte und Serialisierung
13.12.1 Objekte mit der Standard-Serialisierung speichern und lesen
13.12.2 Zwei einfache Anwendungen der Serialisierung
13.12.3 Die Schnittstelle Serializable
13.12.4 Nicht serialisierbare Attribute aussparen
13.12.5 Das Abspeichern selbst in die Hand nehmen
13.12.6 Tiefe Objektkopien
13.12.7 Versionenverwaltung und die SUID
13.12.8 Wie die ArrayList serialisiert
13.12.9 Probleme mit der Serialisierung
13.12.10 Serialisieren in XML-Dateien
13.12.11 JavaBeans Persistence
13.12.12 XStream
13.13 Tokenizer
13.13.1 StreamTokenizer
13.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten
13.14 Zum Weiterlesen

14 Die eXtensible Markup Language (XML)

14.1 Auszeichnungssprachen
14.1.1 Die Standard Generalized Markup Language (SGML)
14.1.2 Extensible Markup Language (XML)
14.2 Eigenschaften von XML-Dokumenten
14.2.1 Elemente und Attribute
14.2.2 Beschreibungssprache für den Aufbau von XML-Dokumenten
14.2.3 Schema – eine Alternative zu DTD
14.2.4 Namensraum (Namespace)
14.2.5 XML-Applikationen
14.3 Die Java-APIs für XML
14.3.1 Das Document Object Model (DOM)
14.3.2 Simple API for XML Parsing (SAX)
14.3.3 Pull-API StAX
14.3.4 Java Document Object Model (JDOM)
14.3.5 JAXP als Java-Schnittstelle zu XML
14.3.6 DOM-Bäume einlesen mit JAXP
14.4 Serielle Verarbeitung mit StAX
14.4.1 Unterschiede der Verarbeitungsmodelle
14.4.2 XML-Dateien mit dem Cursor-Verfahren lesen
14.4.3 XML-Dateien mit dem Iterator-Verfahren verarbeiten
14.4.4 Mit Filtern arbeiten
14.4.5 XML-Dokumente schreiben
14.5 Serielle Verarbeitung von XML mit SAX
14.5.1 Schnittstellen von SAX
14.5.2 SAX-Parser erzeugen
14.5.3 Die wichtigsten Methoden der Schnittstelle ContentHandler
14.5.4 ErrorHandler und EntityResolver
14.6 XML-Dateien mit JDOM verarbeiten
14.6.1 JDOM beziehen
14.6.2 Paketübersicht
14.6.3 Die Document-Klasse
14.6.4 Eingaben aus der Datei lesen
14.6.5 Das Dokument im XML-Format ausgeben
14.6.6 Der Dokumenttyp
14.6.7 Elemente
14.6.8 Zugriff auf Elementinhalte
14.6.9 Liste mit Unterelementen erzeugen
14.6.10 Neue Elemente einfügen und ändern
14.6.11 Attributinhalte lesen und ändern
14.6.12 XPath
14.7 Transformationen mit XSLT
14.7.1 Templates und XPath als Kernelemente von XSLT
14.7.2 Umwandlung von XML-Dateien mit JDOM und JAXP
14.8 Java Architecture for XML Binding (JAXB)
14.8.1 Beans für JAXB aufbauen
14.8.2 JAXBContext und die Marshaller/ Unmarshaller
14.9 HTML-Dokumente einlesen
14.10 Zum Weiterlesen

15 Grafische Oberflächen mit Swing

15.1 Das Abstract Window Toolkit und Swing
15.1.1 Abstract Window Toolkit (AWT)
15.1.2 Java Foundation Classes
15.1.3 Was Swing von AWT unterscheidet
15.1.4 Die Klasse Toolkit
15.2 Fenster unter grafischen Oberflächen
15.2.1 Swing-Fenster darstellen
15.2.2 AWT-Fenster darstellen
15.2.3 Sichtbarkeit des Fensters
15.2.4 Größe und Position des Fensters verändern
15.2.5 Unterklassen der Fenster-Klassen bilden
15.2.6 Fenster- und Dialog-Dekoration
15.2.7 Dynamisches Layout während einer Größenänderung
15.3 Beschriftungen (JLabel)
15.3.1 Mehrzeiliger Text, HTML in der Darstellung
15.4 Icon und ImageIcon für Bilder auf Swing-Komponenten
15.4.1 Die Schnittstelle Icon
15.5 Es tut sich was – Ereignisse beim AWT
15.5.1 Die Klasse AWTEvent
15.5.2 Events auf verschiedenen Ebenen
15.5.3 Swings Ereignisquellen und Horcher (Listener)
15.5.4 Listener implementieren
15.5.5 Listener bei dem Ereignisauslöser anmelden/abmelden
15.5.6 Aufrufen der Listener im AWT-Event-Thread
15.5.7 Adapterklassen nutzen
15.5.8 Innere Mitgliedsklassen und innere anonyme Klassen
15.6 Schaltflächen
15.6.1 Normale Schaltflächen (JButton)