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 9 Besondere Klassen der Java SE
  Pfeil 9.1 Vergleichen von Objekten
    Pfeil 9.1.1 Natürlich geordnet oder nicht?
    Pfeil 9.1.2 Die Schnittstelle Comparable
    Pfeil 9.1.3 Die Schnittstelle Comparator
    Pfeil 9.1.4 Rückgabewerte kodieren die Ordnung
  Pfeil 9.2 Wrapper-Klassen und Autoboxing
    Pfeil 9.2.1 Wrapper-Objekte erzeugen
    Pfeil 9.2.2 Konvertierungen in eine String-Repräsentation
    Pfeil 9.2.3 Die Basisklasse Number für numerische Wrapper-Objekte
    Pfeil 9.2.4 Vergleiche durchführen mit »compare()«, »compareTo()« und »equals()«
    Pfeil 9.2.5 Die Klasse Integer
    Pfeil 9.2.6 Die Klassen Double und Float für Fließkommazahlen
    Pfeil 9.2.7 Die Boolean-Klasse
    Pfeil 9.2.8 Autoboxing: Boxing und Unboxing
  Pfeil 9.3 Object ist die Mutter aller Klassen
    Pfeil 9.3.1 Klassenobjekte
    Pfeil 9.3.2 Objektidentifikation mit »toString()«
    Pfeil 9.3.3 Objektgleichheit mit »equals()« und Identität
    Pfeil 9.3.4 Klonen eines Objekts mit »clone()« *
    Pfeil 9.3.5 Hashcodes über »hashCode()« liefern *
    Pfeil 9.3.6 Aufräumen mit »finalize()« *
    Pfeil 9.3.7 Synchronisation *
  Pfeil 9.4 Die Spezial-Oberklasse Enum
    Pfeil 9.4.1 Methoden auf Enum-Objekten
    Pfeil 9.4.2 »Enum« mit eigenen Konstruktoren und Methoden *
  Pfeil 9.5 Erweitertes »for« und »Iterable«
    Pfeil 9.5.1 Die Schnittstelle »Iterable«
    Pfeil 9.5.2 Einen eigenen Iterable implementieren *
  Pfeil 9.6 Zum Weiterlesen

»Einen Rat befolgen heißt, die Verantwortung verschieben.« – Johannes Urzidil (1896–1970)

9 Besondere Klassen der Java SE


Rheinwerk Computing - Zum Seitenanfang

9.1 Vergleichen von Objekten  Zur nächsten ÜberschriftZur vorigen Überschrift

Sollen Objekte verglichen werden, muss es eine Ordnung dieser Typen geben. Wie sollte das System sonst selbstständig entscheiden können, ob eine Person zum Beispiel kleiner als eine andere Person ist? Weil die eine Person 1,50 Meter groß ist, die andere aber 1,80 Meter, oder weil die eine Person eine Million Euro auf dem Konto hat und die andere nur fünf Euro? [Im 10. Jahrhundert lebte der Großwesir Abdul Kassem Ismael, der immer seine gesamte Bibliothek mit 117.000 Bänden mitführte. Die trainierten 400 Kamele transportierten die Werke in alphabetischer Reihenfolge. ] Diese Fragen sind wichtig, wenn wir zum Beispiel eine Liste sortieren wollen.


Rheinwerk Computing - Zum Seitenanfang

9.1.1 Natürlich geordnet oder nicht?  Zur nächsten ÜberschriftZur vorigen Überschrift

In Java gibt es zwei unterschiedliche Schnittstellen (in zwei unterschiedlichen Paketen) zur Bestimmung der Ordnung:

  • Comparable: Implementiert eine Klasse Comparable, so können sich die Objekte selbst mit anderen Objekten vergleichen. Da die Klassen im Allgemeinen nur ein Sortierkriterium implementieren, wird hierüber eine so genannte natürliche Ordnung (engl. natural ordering) realisiert.
  • Comparator: Eine implementierende Klasse, die sich Comparator nennt, nimmt zwei Objekte an und vergleicht sie. Ein Comparator für Räume könnte zum Beispiel nach der Anzahl der Personen oder auch nach der Größe in Quadratmetern vergleichen; die Implementierung von Comparable wäre nicht sinnvoll, weil hier nur ein Kriterium natürlich umgesetzt werden kann, ein Raum aber nicht die Ordnung hat.

Zusammenfassend lässt sich sagen: Während Comparable üblicherweise nur ein Sortierkriterium umsetzt, kann es viele Extraklassen vom Typ Comparator geben, die jeweils unterschiedliche Ordnungen definieren.

Comparable und Comparator in der Java-API

Eine Implementierung von Comparable findet sich genau dort, wo eine natürliche Ordnung naheliegt, etwa bei:

  • String
  • BigDecimal, BigInteger, Byte, Character, Double, Float, Integer, Long, Short
  • Date
  • File, URI
  • Enum
  • TimeUnit

Von Comparator finden wir in der API-Dokumentation nur java.text.Collator vermerkt.


Rheinwerk Computing - Zum Seitenanfang

9.1.2 Die Schnittstelle Comparable  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Schnittstelle Comparable kommt aus dem java.lang-Paket und deklariert eine Methode:


interface java.lang.Comparable<T>


  • int compareTo( T o ) Vergleicht sich mit einem anderen.

Hinweis Wichtig ist neben einer Implementierung von compareTo() auch die passende Realisierung in equals(). Sie ist erst dann konsistent, wenn e1.compareTo(e2) == 0 das gleiche Ergebnis wie e1.equals(e2) liefert, wobei e1 und e2 den gleichen Typ besitzen. Ein Verstoß gegen diese Regel kann bei sortierten Mengen schnell Probleme bereiten; ein Beispiel nennt die API-Dokumentation. Auch sollte die hashCode()-Methode korrekt realisiert sein, denn sind Objekte gleich, müssen auch die Hashcodes gleich sein. Und die Gleichheit bestimmen eben equals()/compareTo().

e.compareTo(null) sollte eine NullPointerException auslösen, auch wenn e.equals(null) die Rückgabe false liefert.



Rheinwerk Computing - Zum Seitenanfang

9.1.3 Die Schnittstelle Comparator  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Schnittstelle Comparator kommt aus dem Paket java.util und deklariert:


interface java.util.Comparator<T>


  • int compare( T o1, T o2 ) Vergleicht zwei Argumente auf ihre Ordnung.
  • boolean equals( Object obj ) Testet, ob Comparator-Objekte gleich sind. Das testet keine Gleichheit von Objekten! Die Methode muss nicht zwingend implementiert werden, da ja schon Object eine Implementierung bereitstellt. Sie steht hier nur, damit eine API-Dokumentation dieses Missverständnis erklärt.

Rheinwerk Computing - Zum Seitenanfang

9.1.4 Rückgabewerte kodieren die Ordnung  topZur vorigen Überschrift

Der Rückgabewert von compare() beim Comparator beziehungsweise compareTo() bei Comparable ist <0, =0 oder >0 und bestimmt so die Ordnung der Objekte. Nehmen wir zwei Objekte o1 und o2 an, deren Klassen Comparable implementieren. Dann gilt folgende Übereinkunft:

  • o1.compareTo( o2 ) < 0 o1 < o2
  • o1.compareTo( o2 ) == 0 o1 == o2
  • o1.compareTo( o2 ) > 0 o1 > o2

Ein externer Comparator (symbolisch comp genannt) verhält sich ähnlich:

  • comp.compare( o1, o2 ) < 0 o1 < o2
  • comp.compare( o1, o2 ) == 0 o1 == o2
  • comp.compare( o1, o2 ) > 0 o1 > o2

Tipp Sollen Objekte mit einem Comparator verglichen werden, aber null-Werte vorher aussortiert werden, so wird seit Java 7 die statische Methode int compare(T a, T b, Comparator<? super T> c) aus der Klasse Objects nützlich. Die Methode liefert 0, wenn a und b beide entweder null sind oder der Comparator die Objekte a und b für gleich erklärt. Sind a und b beide ungleich null, so ist die Rückgabe c.compare(a, b). Ist nur a oder b gleich null, so hängt es vom Comparator und der Reihenfolge der Parameter ab.


Den größten Raum einer Sammlung finden

Wir wollen Räume ihrer Größe nach sortieren und müssen dafür einen Comparator schreiben (dass Räume Comparable sind, ist nicht angebracht, da es keine natürliche Ordnung für Räume gibt). Daher soll ein externes Comparator-Objekt entscheiden, welches Raum-Objekt nach der Anzahl seiner Quadratmeter größer ist.

Der Raum enthält für das kleine Demoprogramm nur einen parametrisierten Konstruktor und merkt sich dort seine Quadratmeter:

Listing 9.1  com/tutego/insel/util/RoomComparatorDemo.java, Room

class Room
{
  int sm;

  Room( int sm )
  {
    this.sm = sm;
  }
}

Der spezielle Raum-Comparator ist das eigentlich Interessante:

Listing 9.2  com/tutego/insel/util/RoomComparatorDemo.java, RoomComparator

class RoomComparator implements Comparator<Room>
{
  @Override public int compare( Room room1, Room room2 )
  {
    return room1.sm – room2.sm;
  }
}

Er bildet die Differenz der Raumgrößen, was eine einfache Möglichkeit darstellt, eine Rückgabe <0, =0 oder >0 zu bekommen. Bei Fließkommazahlen funktioniert das nicht – denn (int)(0.1 – 0.0), (int)(0.0 – 0.1) und (int)(0.0 – 0.0) ergeben alle 0, wären also gleich – bei Ganzzahlen ist der Vergleich aber in Ordnung. Ab Java 7 lässt sich Integer.compareTo(room1.sm, room2.sm) einsetzen.

Mit dem Comparator-Objekt lässt sich eine Raumliste sortieren:

Listing 9.3  com/tutego/insel/util/RoomComparatorDemo.java, RoomComparatorDemo main()

List<Room> list = Arrays.asList(new Room(100), new Room(1123), new Room(123) );

Collections.sort( list, new RoomComparator() );
System.out.println( list.get(0).sm );      // 100

Hinweis Ist ein Comparator mit einer Datenstruktur – wie dem TreeSet oder der TreeMap – verbunden, muss die Comparator-Klasse Serializable (siehe Kapitel 17, »Datenströme«) implementieren, wenn auch die Datenstruktur serialisiert werden soll.




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