Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 13 Datenstrukturen und Algorithmen
  Pfeil 13.1 Datenstrukturen und die Collection-API
    Pfeil 13.1.1 Designprinzip mit Schnittstellen, abstrakten und konkreten Klassen
    Pfeil 13.1.2 Die Basis-Schnittstellen Collection und Map
    Pfeil 13.1.3 Das erste Programm mit Container-Klassen
    Pfeil 13.1.4 Die Schnittstelle Collection und Kernkonzepte
    Pfeil 13.1.5 Schnittstellen, die Collection erweitern, und Map
    Pfeil 13.1.6 Konkrete Container-Klassen
    Pfeil 13.1.7 Welche Container-Klasse nehmen?
    Pfeil 13.1.8 Generische Datentypen in der Collection-API
    Pfeil 13.1.9 Die Schnittstelle »Iterable« und das erweiterte »for«
  Pfeil 13.2 Mit einem Iterator durch die Daten wandern
    Pfeil 13.2.1 Die Schnittstellen Enumeration und Iterator
    Pfeil 13.2.2 Iteratoren von Sammlungen und das erweiterte »for«
    Pfeil 13.2.3 Fail-Fast-Iterator und die ConcurrentModificationException
  Pfeil 13.3 Listen
    Pfeil 13.3.1 Auswahlkriterium ArrayList oder LinkedList
    Pfeil 13.3.2 Die Schnittstelle List
    Pfeil 13.3.3 ListIterator *
    Pfeil 13.3.4 ArrayList
    Pfeil 13.3.5 LinkedList
    Pfeil 13.3.6 Der Feld-Adapter »Arrays.asList()«
    Pfeil 13.3.7 »toArray()« von Collection verstehen – die Gefahr einer Falle erkennen
    Pfeil 13.3.8 Primitive Elemente in den Collection-Datenstrukturen
  Pfeil 13.4 Datenstrukturen mit Ordnung
    Pfeil 13.4.1 Algorithmen mit Such- und Sortiermöglichkeiten
    Pfeil 13.4.2 Den größten und kleinsten Wert einer Collection finden
    Pfeil 13.4.3 Sortieren
  Pfeil 13.5 Mengen (Sets)
    Pfeil 13.5.1 HashSet
    Pfeil 13.5.2 TreeSet – die Menge durch Bäume
    Pfeil 13.5.3 LinkedHashSet
  Pfeil 13.6 Stack (Kellerspeicher, Stapel)
    Pfeil 13.6.1 Die Methoden von »Stack«
    Pfeil 13.6.2 Ein »Stack« ist ein »Vector« – aha!
  Pfeil 13.7 Queues (Schlangen) und Deques
    Pfeil 13.7.1 Die Schnittstelle »Queue«
    Pfeil 13.7.2 Blockierende Queues und Prioritätswarteschlangen
    Pfeil 13.7.3 »Deque«-Klassen
  Pfeil 13.8 Assoziative Speicher
    Pfeil 13.8.1 Die Klassen »HashMap« und »TreeMap«
    Pfeil 13.8.2 Einfügen und Abfragen der Datenstruktur
    Pfeil 13.8.3 Über die Bedeutung von »equals()«, »hashCode()«
    Pfeil 13.8.4 IdentityHashMap
    Pfeil 13.8.5 Das Problem von veränderten Elementen
    Pfeil 13.8.6 Aufzählungen und Ansichten des Assoziativspeichers
    Pfeil 13.8.7 Der Gleichheitstest, Hash-Wert und Klon einer Hash-Tabelle*
    Pfeil 13.8.8 Die Arbeitsweise einer Hash-Tabelle *
  Pfeil 13.9 Die Properties-Klasse
    Pfeil 13.9.1 Properties setzen und lesen
    Pfeil 13.9.2 Properties verketten
    Pfeil 13.9.3 Hierarchische Eigenschaften
    Pfeil 13.9.4 Eigenschaften ausgeben *
    Pfeil 13.9.5 Properties laden und speichern
  Pfeil 13.10 Algorithmen in Collections
    Pfeil 13.10.1 Nicht-änderbare Datenstrukturen
    Pfeil 13.10.2 Null Object Pattern und leere Sammlungen zurückgeben
    Pfeil 13.10.3 Mit der Halbierungssuche nach Elementen fahnden
    Pfeil 13.10.4 Ersetzen, Kopieren, Füllen, Umdrehen, Rotieren, Durchmischen *
    Pfeil 13.10.5 Häufigkeit eines Elements *
    Pfeil 13.10.6 nCopies() *
    Pfeil 13.10.7 Singletons *
  Pfeil 13.11 Synchronisation der Datenstrukturen
    Pfeil 13.11.1 Lock-free-Algorithmen aus java.util.concurrent
    Pfeil 13.11.2 Wrapper zur Synchronisation
    Pfeil 13.11.3 »CopyOnWriteArrayList« und »CopyOnWriteArraySet«
  Pfeil 13.12 Die Klasse »BitSet« für Bitmengen *
    Pfeil 13.12.1 Ein »BitSet« anlegen, füllen und erfragen
    Pfeil 13.12.2 Mengenorientierte Operationen
    Pfeil 13.12.3 Methodenübersicht
    Pfeil 13.12.4 Primzahlen in einem BitSet verwalten
  Pfeil 13.13 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

13.9 Die Properties-Klasse  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse Properties ist eine Sonderform der Assoziativspeicher, bei der Schlüssel-Werte-Paare immer vom Typ String sind. Da sich die Einträge in einer Datei speichern und wieder auslesen lassen, können auf diese Weise fest verdrahtete Zeichenketten aus dem Programmtext externalisiert werden, sodass sich die Werte auch ohne Neuübersetzung bequem verändern lassen.


Rheinwerk Computing - Zum Seitenanfang

13.9.1 Properties setzen und lesen  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Methode setProperty(String, String) fügt dem Properties-Objekt ein Schlüssel-Werte-Paar hinzu. Um später wieder an den Wert zu kommen, wird getProperty(String) mit dem Schlüssel aufgerufen und liefert dann – wenn beide Zeichenketten vorher verbunden wurden – den Wert:

Properties props = new Properties();
props.setProperty( "User", "King Karl" );
props.setProperty( "Version", "" + 0.02 );
System.out.println( props.getProperty("User") );      // King Karl
System.out.println( props.getProperty("Passwort") );  // null

Rheinwerk Computing - Zum Seitenanfang

13.9.2 Properties verketten  Zur nächsten ÜberschriftZur vorigen Überschrift

Properties-Objekte lassen sich hierarchisch verbinden, sodass im Fall einer erfolglosen Suche nach einem Schlüssel das Properties-Objekt die Anfrage an ein übergeordnetes Properties-Objekt weiterleitet; das Eltern-Properties-Objekt wird einfach im Konstruktor übergeben:

Listing 13.25  com/tutego/insel/util/map/PropertiesDemo.java. main()

Properties defaultProperties = new Properties(),
           userProperties    = new Properties( defaultProperties );

Die Zeilen erzeugen zwei Properties-Objekte. Obwohl am Anfang beide leer sind, werden doch die in defaultProperties hinzugefügten Einträge auch in userProperties sichtbar sein. Im Folgenden ist abzulesen, wie userProperties einen Eintrag überschreibt:

defaultProperties.setProperty( "User", "C.Ullenboom" );
defaultProperties.setProperty( "Password", "(nicht gesetzt)" );
userProperties.setProperty( "Password", "SagIchNet" );

Zuerst durchsucht ein Property-Exemplar die eigene Datenstruktur. Liefert diese Property keinen Eintrag oder keinen Wert vom Typ String, so wird das im Konstruktoraufruf angegebene Property-Objekt durchsucht. Auf diese Weise lassen sich mehrstufige Hierarchien von Property-Verzeichnissen konstruieren. Ein list() auf die defaultProperties beziehungsweise userProperties ergibt die Ausgabe:

-- listing properties --
Password=(nicht gesetzt)
User=C.Ullenboom
-- listing properties --
Password=SagIchNet
User=C.Ullenboom

class java.util.Properties
extends Hashtable<Object,Object>

  • Properties() Erzeugt ein leeres Properties-Objekt ohne Schlüssel und Werte.
  • Properties( Properties defaults ) Erzeugt ein leeres Properties-Objekt, das bei Anfragen auch auf die Einträge in dem übergebenen Properties-Objekt zurückgreift.
  • String getProperty( String key ) Sucht in den Properties nach der Zeichenkette key als Schlüssel und liefert den zugehörigen Wert. Durchsucht auch übergeordnete Properties-Objekte.
  • String getProperty( String key, String default ) Sucht in den Properties nach der Zeichenkette key als Schlüssel und liefert den zugehörigen Wert. Ist der Schlüssel nicht vorhanden, wird der String default zurückgegeben.
  • Object setProperty( String key, String value ) Trägt Schlüssel und Wert im Properties-Exemplar ein. Existiert der Schlüssel schon, wird er überschrieben. Mitunter verdeckt der Schlüssel den Wert der Property in der übergeordneten Property.

Rheinwerk Computing - Zum Seitenanfang

13.9.3 Hierarchische Eigenschaften  Zur nächsten ÜberschriftZur vorigen Überschrift

Leider kann eine Eigenschaften-Datei nicht segmentiert werden, wie etwa alte Windows-INI-Dateien dies machen. Die Alternative besteht darin, hierarchisch benannte Eigenschaften zu erzeugen, indem eine Zeichenkette vor jeden Schlüssel gesetzt wird. Um zum Beispiel einen Schlüssel User einmal unter Private und einmal unter Public zu halten, lässt sich die Eigenschaft Private.User und Public.User einsetzen. Doch leider tauchen sie nach dem Speichern quer gewürfelt in der Datei auf, weil ein Assoziativspeicher keine Sortierung besitzt.


Rheinwerk Computing - Zum Seitenanfang

13.9.4 Eigenschaften ausgeben *  Zur nächsten ÜberschriftZur vorigen Überschrift

Die list()-Methode wandert durch die Daten eines Properties-Exemplars und schreibt sie in einen PrintStream oder PrintWriter. Das sind Datenströme, denen wir uns näher im Eingabe- und Ausgabekapitel widmen wollen. Eine Ausgabe auf dem Bildschirm erhalten wir mit list(System.out). Schlüssel und Werte trennt ein Gleichheitszeichen. Die Ausgabe über list() ist gekürzt, denn ist ein Wert länger als 40 Zeichen, wird er abgekürzt. Den Paaren geht eine Kopfzeile der Art -- listing properties -- voran. Es ist wichtig, zu verstehen, dass durch die Art der Speicherung (ein Assoziativspeicher auf Basis des Hashings) die Ausgabe unsortiert erfolgt.


class java.util.Properties
extends Hashtable<Object,Object>

  • void list( PrintStream out ) Listet die Properties auf dem PrintStream aus.
  • void list( PrintWriter out ) Listet die Properties auf dem PrintWriter aus.

Rheinwerk Computing - Zum Seitenanfang

13.9.5 Properties laden und speichern  topZur vorigen Überschrift

Während die list()-Methode nur für Testausgaben gedacht ist, dient store() zum Speichern und load() zum Laden eines Properties-Objekts in einer ASCII-Datei, die Schlüssel und Werte mit einem Gleichheitszeichen trennt.

Das folgende Beispiel initialisiert ein Properties-Objekt mit den Systemeigenschaften und fügt dann einen Wert hinzu. Anschließend macht store() die Daten persistent, load() liest sie wieder, und list() gibt die Eigenschaften auf dem Bildschirm aus:

Listing 13.26  com/tutego/insel/util/map/SaveProperties.java, main()

Writer writer = null;
Reader reader = null;

try
{
  writer = new FileWriter( "properties.txt" );

  Properties prop1 = new Properties( System.getProperties() );
  prop1.setProperty( "MeinNameIst", "Forrest Gump" );
  prop1.store( writer, "Eine Insel mit zwei Bergen" );

  reader = new FileReader( "properties.txt" );

  Properties prop2 = new Properties();
  prop2.load( reader );
  prop2.list( System.out );
}
catch ( IOException e )
{
  e.printStackTrace();
}
finally
{
  try { writer.close(); } catch ( Exception e ) { }
  try { reader.close(); } catch ( Exception e ) { }
}

class java.util.Properties
extends Hashtable<Object,Object>

  • void load( InputStream inStream ) Lädt eine Properties-Liste aus einem Eingabestrom.
  • void store( OutputStream out, String header ) Speichert die Properties-Liste mit Hilfe des Ausgabestroms ab. Am Kopf der Datei wird eine Kennung geschrieben, die im zweiten Argument steht. Die Kennung darf null sein.
  • void Enumeration<?> propertyNames() Liefert eine Enumeration von allen Schlüsseln in der Properties-Liste inklusive der Standardwerte aus übergeordneten Properties.

Properties im XML-Format speichern

Die Properties-Klasse kann die Eigenschaften im XML-Format speichern und laden. Zum Speichern dient die Methode storeXML(), und zum Laden dient loadFromXML(). Die XML-Dateien haben ein spezielles Format, wie es der Einzeiler System.getProperties().storeToXML(System.out, ""); zeigt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment></comment>
<entry key="java.runtime.name">Java(TM) 2 Runtime Environment, Standard Edition
</entry>
<entry key="java.vm.vendor">Sun Microsystems Inc.</entry>
<entry key="java.vendor.url">http://java.sun.com/</entry>
<entry key="path.separator">;</entry>
...
<entry key="sun.desktop">windows</entry>
<entry key="sun.cpu.isalist">pentium i486 i386</entry>
</properties>

Die Methode loadFromXML() liest aus einem InputStream und löst im Fall eines fehlerhaften Dateiformats eine InvalidPropertiesFormatException aus. Beim Speichern kann so ein Fehler natürlich nicht auftreten. Und genauso, wie bei store() ein OutputStream mit einem Kommentar gespeichert wird, macht das auch storeToXML(). Die Methode ist mit einem zusätzlichen Parameter überladen, der eine XML-Kodierung erlaubt. Ist der Wert nicht gesetzt, so ist die Standardkodierung UTF-8.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern