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 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB

Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
Pfeil 4 Der Umgang mit Zeichenketten
Pfeil 4.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil 4.1.1 ASCII
Pfeil 4.1.2 ISO/IEC 8859-1
Pfeil 4.1.3 Unicode
Pfeil 4.1.4 Unicode-Zeichenkodierung
Pfeil 4.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil 4.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil 4.1.7 Unicode 4.0 und Java *
Pfeil 4.2 Die Character-Klasse
Pfeil 4.2.1 Ist das so?
Pfeil 4.2.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil 4.2.3 Ziffern einer Basis *
Pfeil 4.3 Zeichenfolgen
Pfeil 4.4 Die Klasse String und ihre Methoden
Pfeil 4.4.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil 4.4.2 Konkatenation mit +
Pfeil 4.4.3 String-Länge und Test auf Leerstring
Pfeil 4.4.4 Zugriff auf ein bestimmtes Zeichen mit charAt( )
Pfeil 4.4.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil 4.4.6 Das Hangman-Spiel
Pfeil 4.4.7 Gut, dass wir verglichen haben
Pfeil 4.4.8 Phonetische Vergleiche *
Pfeil 4.4.9 String-Teile extrahieren
Pfeil 4.4.10 Strings anhängen, Groß-/Kleinschreibung und Leerraum
Pfeil 4.4.11 Suchen und ersetzen
Pfeil 4.4.12 String-Objekte mit Konstruktoren neu anlegen *
Pfeil 4.5 Konvertieren zwischen Primitiven und Strings
Pfeil 4.5.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil 4.5.2 Stringinhalt in einen primitiven Wert konvertieren
Pfeil 4.5.3 String-Repräsentation im Format Binär, Hex, Oktal *
Pfeil 4.6 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil 4.6.1 Anlegen von StringBuilder/StringBuffer-Objekten
Pfeil 4.6.2 StringBuilder/StringBuffer in andere Zeichenkettenformate konvertieren
Pfeil 4.6.3 Zeichen(folgen) erfragen
Pfeil 4.6.4 Daten anhängen
Pfeil 4.6.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil 4.6.6 Länge und Kapazität eines StringBuilder/StringBuffer-Objekts *
Pfeil 4.6.7 Vergleichen von String mit StringBuilder und StringBuffer
Pfeil 4.6.8 hashCode() bei StringBuilder/StringBuffer *
Pfeil 4.7 CharSequence als Basistyp *
Pfeil 4.8 Reguläre Ausdrücke
Pfeil 4.8.1 Pattern.matches() bzw. String#matches()
Pfeil 4.8.2 Die Klassen Pattern und Matcher
Pfeil 4.8.3 Finden und nicht matchen
Pfeil 4.8.4 Gierige und nicht gierige Operatoren *
Pfeil 4.8.5 Mit MatchResult alle Ergebnisse einsammeln *
Pfeil 4.8.6 Suchen und Ersetzen mit Mustern
Pfeil 4.8.7 Hangman Version 2
Pfeil 4.9 Zerlegen von Zeichenketten
Pfeil 4.9.1 Splitten von Zeichenketten mit split()
Pfeil 4.9.2 Die Klasse Scanner
Pfeil 4.9.3 Die Klasse StringTokenizer *
Pfeil 4.9.4 BreakIterator als Zeichen-, Wort-, Zeilen- und Satztrenner *
Pfeil 4.10 Zeichenkodierungen, XML/HTML-Entitys, Base64 *
Pfeil 4.10.1 Unicode und 8-Bit-Abbildungen
Pfeil 4.10.2 Das Paket java.nio.charset und der Typ Charset
Pfeil 4.10.3 Konvertieren mit OutputStreamWriter/InputStreamReader-Klassen *
Pfeil 4.10.4 XML/HTML-Entitys ausmaskieren
Pfeil 4.10.5 Base64-Kodierung
Pfeil 4.11 Ausgaben formatieren
Pfeil 4.11.1 Formatieren und Ausgeben mit format()
Pfeil 4.11.2 Die Formatter-Klasse *
Pfeil 4.11.3 Formatieren mit Masken *
Pfeil 4.11.4 Format-Klassen
Pfeil 4.11.5 Zahlen, Prozente und Währungen mit NumberFormat und DecimalFormat formatieren *
Pfeil 4.11.6 MessageFormat und Pluralbildung mit ChoiceFormat
Pfeil 4.12 Sprachabhängiges Vergleichen und Normalisierung *
Pfeil 4.12.1 Die Klasse Collator
Pfeil 4.12.2 Effiziente interne Speicherung für die Sortierung
Pfeil 4.12.3 Normalisierung
Pfeil 4.13 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

4.6 Veränderbare Zeichenketten mit StringBuilder und StringBufferZur nächsten Überschrift

Zeichenketten, die in der virtuellen Maschine in String-Objekten gespeichert sind, haben die Eigenschaft, dass ihr Inhalt nicht mehr verändert werden kann. Anders verhalten sich die Exemplare der Klasse StringBuilder und StringBuffer, an denen sich Veränderungen vornehmen lassen. Die Veränderungen betreffen anschließend das StringBuilder/StringBuffer-Objekt selbst, und es wird kein neu erzeugtes Objekt als Ergebnis geliefert, wie zum Beispiel beim Plus-Operator und der concat()-Methode bei herkömmlichen String-Objekten. Sonst sind sich aber die Implementierung von String-Objekten und StringBuilder/StringBuffer-Objekten ähnlich. In beiden Fällen nutzen die Klassen ein internes Zeichenfeld.

Die Klasse StringBuilder bietet die gleichen Methoden wie StringBuffer, nur nicht synchronisiert. Bei nebenläufigen Programmen kann daher die interne Datenstruktur vom StringBuilder-Objekt inkonsistent werden, sie ist aber dafür bei nicht-nebenläufigen Zugriffen ein wenig schneller.

Überblick

StringBuilder und StringBuffer sind schnell erklärt: Es gibt einen Konstruktor, der die Objekte aufbaut, Modifizierungsmethoden wie append() und eine toString()-Methode, die das Ergebnis als String liefert. Nutzen wir dies für eine eigene Methode enumerate(), die ein Stringfeld abläuft und eine Bildschirmaufzählung erzeugt:

Listing 4.9: Enumerator.java

public class Enumerator
{
public static String enumerate( String... lines )
{
if ( lines == null || lines.length == 0 )
return "";

StringBuilder sb = new StringBuilder();

for ( int i = 0; i < lines.length; i++ )
{
sb.append( i + 1 );
sb.append( ". " );
sb.append( lines[i] );
sb.append( '\n' );
}

return sb.toString().trim();
}

public static void main( String[] args )
{
System.out.println(enumerate( "Aufstehen", "Frühstücken" ) );
}
}

Die Ausgabe ist:

1. Aufstehen

2. Frühstücken


Rheinwerk Computing - Zum Seitenanfang

4.6.1 Anlegen von StringBuilder/StringBuffer-ObjektenZur nächsten ÜberschriftZur vorigen Überschrift

Mit mehreren Konstruktoren lassen sich StringBuilder/StringBuffer-Objekte aufbauen:

final class java.lang.StringBuffer
final class java.lang.StringBuilder
implements Appendable, CharSequence, Serializable
  • StringBuffer()
  • StringBuilder()
    Legt ein neues Objekt an, das die leere Zeichenreihe enthält und Platz für (zunächst) bis zu 16 Zeichen bietet. Bei Bedarf wird automatisch Platz für weitere Zeichen bereitgestellt.
  • StringBuffer(int length)
  • StringBuilder(int length)
    Wie oben, jedoch reicht die anfängliche Kapazität des Objekts für die angegebene Anzahl an Zeichen. Optimalerweise ist die Größe so zu setzen, dass sie der Endgröße der dynamischen Zeichenfolge nahekommt.
  • StringBuffer(String str)
  • StringBuilder(String str)
    Baut ein Objekt, das eine Kopie der Zeichen aus str enthält. Zusätzlich wird bereits Platz für 16 weitere Zeichen eingeplant.
  • StringBuffer(CharSequence seq)
  • StringBuilder(CharSequence seq)
    Erzeugt ein neues Objekt aus einer CharSequence. Damit können auch die Zeichenfolgen anderer StringBuffer- und StringBuilder-Objekte Basis dieses Objekts werden.

Da nur String-Objekte von der Sprache bevorzugt werden, bleibt uns allein der explizite Aufruf eines Konstruktors, um StringBuilder/StringBuffer-Exemplare anzulegen. Alle String-Literale in Anführungszeichen sind ja schon Exemplare der Klasse String.

Hinweis

Weder in der Klasse String noch in StringBuilder/StringBuffer existiert ein Konstruktor, der explizit ein char als Parameter zulässt, um aus dem angegebenen Zeichen eine Zeichenkette aufzubauen. Dennoch gibt es bei StringBuilder/StringBuffer einen Konstruktor, der ein int annimmt, wobei die übergebene Ganzzahl die interne Startgröße des Puffers spezifiziert. Rufen wir den Konstruktor mit char auf – etwa einem »*« –, so konvertiert der Compiler automatisch das Zeichen in ein int. Das resultierende Objekt enthält kein Zeichen, sondern hat nur eine anfängliche Kapazität von 42 Zeichen, da 42 der ASCII-Code des Sternchens ist. Korrekt ist daher für ein Zeichen c nur Folgendes: new StringBuilder("" + c) oder new StringBuilder().append(c).


Rheinwerk Computing - Zum Seitenanfang

4.6.2 StringBuilder/StringBuffer in andere Zeichenkettenformate konvertierenZur nächsten ÜberschriftZur vorigen Überschrift

StringBuilder/StringBuffer werden in der Regel intern in Methoden eingesetzt, aber tauchen selten als Parameter- oder Rückgabetyp auf. Aus den Konstruktoren der Klassen konnten wir ablesen, wie bei einem Parametertyp String etwa ein StringBuilder aufgebaut wird, es fehlt aber der Weg zurück.

final class java.lang.StringBuffer
final class java.lang.StringBuilder
implements Appendable, CharSequence, Serializable
  • String toString()
    Erzeugt aus der aktuellen Zeichenkette ein String-Objekt.
  • void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
    Kopiert einen gewünschten Ausschnitt in ein char-Feld.

Rheinwerk Computing - Zum Seitenanfang

4.6.3 Zeichen(folgen) erfragenZur nächsten ÜberschriftZur vorigen Überschrift

Die bekannten Anfragemethoden aus String finden wir auch beim StringBuilder/StringBuffer wieder. So verhalten sich charAt() und getChars() bei Exemplaren beider Klassen identisch. Auch substring(int start) und substring(int start, int end) sind aus der Klasse String bekannt. Wenn nur diese Methoden nötig sind, ist auch ein StringBuilder/StringBuffer unnötig und ein String-Objekt selbst reicht.


Rheinwerk Computing - Zum Seitenanfang

4.6.4 Daten anhängenZur nächsten ÜberschriftZur vorigen Überschrift

Die häufigste Anwendung von StringBuilder/StringBuffer-Objekten ist das Zusammenfügen von Texten aus Daten unterschiedlichen Typs. Dazu deklarieren die Klassen eine Reihe von append()-Methoden, die mit unterschiedlichen Datentypen überladen sind. Die append()-Methoden von StringBuilder geben einen StringBuilder zurück und die von StringBuffer einen StringBuffer. Die append()-Methoden hängen sich immer an das Ende an und vergrößern den internen Platz – das interne char-Feld –, falls es nötig ist. Ein neues StringBuilder/StringBuffer-Objekt erzeugen sie nicht.

Beispiel

Hänge alle Argumente aneinander, und liefere das Ergebnis als String:

Listing 4.10: StringBuilderToStringDemo.java, join

public static String join( Object... strings )
{
StringBuilder result = new StringBuilder();

for ( Object string : strings )
result.append( string );

return result.toString();
}
Die mit Object parametrisierte append()-Methode ruft automatisch toString() auf den Objekten auf. Ein Beispielaufruf könnte so aussehen: join("Aus", ' ', "die Maus").

Die Zusammenfassung listet alle Methoden auf:

final class java.lang.StringBuffer
final class java.lang.StringBuilder
implements Appendable, CharSequence, Serializable
  • StringBuilder/StringBuffer append(boolean b)
  • StringBuilder/StringBuffer append(char c)
  • StringBuilder/StringBuffer append(char[] str)
  • StringBuilder/StringBuffer append(char[] str, int offset, int len)
  • StringBuilder/StringBuffer append(CharSequence s)
  • StringBuilder/StringBuffer append(CharSequence s, int start, int end)
  • StringBuilder/StringBuffer append(double d)
  • StringBuilder/StringBuffer append(float f)
  • StringBuilder/StringBuffer append(int i)
  • StringBuilder/StringBuffer append(long lng)
  • StringBuilder/StringBuffer append(Object obj)
  • StringBuilder/StringBuffer append(String str)
  • StringBuilder/StringBuffer append(StringBuffer sb)

Die Methoden append(char), append(CharSequence) und append(CharSequence, int, int) werden von der Schnittstelle Appendable vorgeschrieben.

Besonders nützlich ist in der Praxis append(CharSequence, int, int), da sich auf diese Weise Teile von String-, StringBuilder- und StringBuffer-Objekten anhängen lassen.

Hinweis

Jede append()-Methode verändert den StringBuilder/StringBuffer und liefert als Rückgabewert noch eine Referenz darauf. Das hat den großen Vorteil, dass sich Aufrufe der append()-Methoden einfach hintereinandersetzen (kaskadieren) lassen:

StringBuilder sb = new StringBuilder( "George Peppard " ).append(',');
sb.append(" Mr. T, ").append("Dirk Benedict, ").append("Dwight Schultz");

Die Auswertung erfolgt von links nach rechts, sodass das Ergebnis ist: »George Peppard, Mr. T, Dirk Benedict, Dwight Schultz«.


Rheinwerk Computing - Zum Seitenanfang

4.6.5 Zeichen(folgen) setzen, löschen und umdrehenZur nächsten ÜberschriftZur vorigen Überschrift

Da sich bei einem StringBuilder/StringBuffer Zeichen verändern lassen, gibt es neben der append()-Methode weitere Modifikationsmethoden, die in der Klasse String fehlen.

Einzelne Zeichen setzen

Neu ist setCharAt(), um in einem StringBuilder/StringBuffer an eine bestimmte Stelle ein Zeichen zu setzen.

Beispiel

Ändere das erste Zeichen im StringBuilder in einen Großbuchstaben:

StringBuilder sb = new StringBuilder( "spare Wasser und dusche mit dem Partner" );
char upperCharacter = Character.toUpperCase( sb.charAt(0) );
sb.setCharAt( 0, upperCharacter );
Das erste Argument 0 in setCharAt() steht für die Position des zu setzenden Zeichens.

Zeichenfolgen einfügen

Die Methode insert(int offset, element) fügt die Zeichenketten-Repräsentation eines Werts vom Typ Typ an der Stelle offset ein. Sie ähnelt der überladenen append()-Methode.

Beispiel

Lies eine Datei ein, und drehe die Zeilen so um, dass die letzte Zeile der Datei oben steht und die erste Zeile der Datei unten. Das Ergebnis auf der Konsole soll ein String sein, der keinen Weißraum zu Beginn und am Ende aufweist:

Listing 4.11: ReverseFile.java, main()

Scanner scanner = new Scanner( ReverseFile.class.getResourceAsStream(
"EastOfJava.txt" ) );
StringBuilder result = new StringBuilder()
;
while ( scanner.hasNextLine() )
result.insert( 0, scanner.nextLine() + "\n" );
System.out.println( result.toString().trim() );
scanner.close();

Für char-Arrays existiert insert() in einer abgewandelten Art: insert(int index, char[] str, int offset, int len). Es wird nicht das komplette Array in den StringBuilder/StringBuffer übernommen, sondern nur ein Ausschnitt.

Einzelnes Zeichen und Zeichenbereiche löschen

Eine Folge von Zeichen lässt sich durch delete(int start, int end) löschen. deleteCharAt(int index) löscht nur ein Zeichen. In beiden Fällen wird ein inkorrekter Index durch eine StringIndexOutOfBoundsException bestraft.

Zeichenbereiche ersetzen

Die Methode replace(int start, int end, String str) löscht zuerst die Zeichen zwischen start und end und fügt anschließend den neuen String str ab start ein. Dabei sind die Endpositionen wie immer exklusiv, das heißt, sie geben das erste Zeichen hinter dem zu verändernden Ausschnitt an.

Beispiel

Ersetze den Teilstring an der Position 4 und 5 (also bis exklusive 6):

StringBuilder sb = new StringBuilder( "Sub-XX-Sens-O-Matic" ); 
// 0123456
System.out.println( sb.replace( 4, 6, "Etha" ) ) ; // Sub-Etha-Sens-O-Matic

Zeichenfolgen umdrehen

Eine weitere Methode reverse() dreht die Zeichenfolge um.

Beispiel

Teste unabhängig von der Groß-/Kleinschreibung, ob der String s ein Palindrom ist. Palindrome lesen sich von vorn genauso wie von hinten, etwa »Rentner«:

boolean isPalindrome =
new StringBuilder( s ).reverse().toString().equalsIgnoreCase( s );


Rheinwerk Computing - Zum Seitenanfang

4.6.6 Länge und Kapazität eines StringBuilder/StringBuffer-Objekts *Zur nächsten ÜberschriftZur vorigen Überschrift

Wie bei einem String lässt sich die Länge und die Anzahl der enthaltenen Zeichen mit der Methode length() erfragen. StringBuilder/StringBuffer-Objekte haben jedoch auch eine interne Puffergröße, die sich mit capacity() erfragen lässt und die im Konstruktor wie beschrieben festgelegt wird. In diesem Puffer, der genauer gesagt ein Array vom Typ char ist, werden die Veränderungen wie das Ausschneiden oder Anhängen von Zeichen vorgenommen. Während length() die Anzahl der Zeichen angibt, ist capacity() immer größer oder gleich length() und sagt etwas darüber aus, wie viele Zeichen der Puffer noch aufnehmen kann, ohne dass intern ein neues, größeres Feld benötigt würde.

Beispiel

sb.length()ergibt 14, aber sb.capacity() ergibt 14 + 16 = 30:

StringBuilder sb = new StringBuilder( "www.tutego.de" );
System.out.println( sb.length() ); // 14
System.out.println( sb.capacity() ); // 30

Die Startgröße sollte mit der erwarteten Größe initialisiert werden, um ein späteres teures internes Vergrößern zu vermeiden. Falls der StringBuilder/StringBuffer einen großen internen Puffer hat, aber auf lange Sicht nur wenig Zeichen besitzt, lässt er sich mit trimToSize() auf eine kleinere Größe schrumpfen.

Ändern der Länge

Soll der StringBuilder/StringBuffer mehr Daten aufnehmen, so ändert setLength() die Länge auf eine angegebene Anzahl von Zeichen. Der Parameter ist die neue Länge. Ist sie kleiner als length(), so wird der Rest der Zeichenkette einfach abgeschnitten. Die Größe des internen Puffers ändert sich dadurch nicht. Ist setLength() größer, so vergrößert sich der Puffer, und die Methode füllt die übrigen Zeichen mit Nullzeichen '\0000' auf. Die Methode ensureCapacity() fordert, dass der interne Puffer für eine bestimmte Anzahl von Zeichen ausreicht. Wenn nötig, legt sie ein neues, vergrößertes char-Array an, verändert aber nicht die Zeichenfolge, die durch das StringBuilder-/StringBuffer-Objekt repräsentiert wird.


Rheinwerk Computing - Zum Seitenanfang

4.6.7 Vergleichen von String mit StringBuilder und StringBufferZur nächsten ÜberschriftZur vorigen Überschrift

Zum Vergleichen von Zeichenketten bietet sich die bekannte equals()-Methode an. Diese ist aber bei StringBuilder/StringBuffer nicht wie erwartet implementiert. Dazu gesellen sich andere Methoden, die zum Beispiel unabhängig von der Groß-/Kleinschreibung vergleichen.

equals() bei der String-Klasse

Ein Blick in die API-Dokumentation der Klasse String zeigt die bekannte equals(Object)-Methode. Zwar erlaubt der Parametertyp durch den Basistyp Object beliebige Objekte (also etwa Point, String, Date, StringBuilder), doch das equals() von String vergleicht nur String/String-Paare. Die Methode beginnt erst dann den Vergleich, wenn das Argument auch vom Typ String ist. Das testet die Methode mit dem speziellen Operator instanceof. Das bedeutet, dass der Compiler mit dem Argumenttyp StringBuilder/StringBuffer bei equals() kein Problem hat, doch zur Laufzeit ist das Ergebnis immer false, da eben ein StringBuilder/StringBuffer nicht instanceof String ist. Ob die Zeichenfolgen dabei gleich sind, spielt keine Rolle.

Eine Lösung für den Vergleich von String mit StringBuilder/StringBuffer ist, zunächst mit toString() den StringBuilder/StringBuffer in einen String zu überführen und dann die beiden Strings mit equals() zu vergleichen.

contentEquals() beim String

Eine allgemeine Methode zum Vergleichen eines Strings mit entweder einem anderen String oder mit StringBuilder/StringBuffer ist contentEquals(CharSequence). Die Methode liefert die Rückgabe true, wenn der String und die CharSequence (String, StringBuilder und StringBuffer sind Klassen vom Typ CharSequence) den gleichen Zeicheninhalt haben. Die interne Länge des Puffers spielt keine Rolle. Ist das Argument null, wird eine NullPointerException ausgelöst.

Beispiel

Vergleiche einen String mit einem StringBuffer:

String       s  = "Elektrisch-Zahnbürster";
StringBuffer sb = new StringBuffer( "Elektrisch-Zahnbürster" );
System.out.println( s.equals(sb) ); // false
System.out.println( s.equals(sb.toString()) ); // true
System.out.println( s.contentEquals(sb) ); // true

equals() bei StringBuffer beziehungsweise StringBuilder?

Wollen wir zwei StringBuffer- beziehungsweise StringBuilder-Objekte miteinander vergleichen, werden wir noch mehr enttäuscht: Die Klassen deklarieren überhaupt keine eigene equals()-Methode. Es gibt zwar die übliche von Object geerbte Methode, doch das heißt, nur Objektreferenzen werden verglichen. Wenn also zwei verschiedene StringBuilder/StringBuffer-Objekte mit gleichem Inhalt mit equals() verglichen werden, kommt trotzdem immer false heraus.

Beispiel

Um den inhaltlichen Vergleich von zwei StringBuilder-Objekten zu realisieren, müssen wir diese erst mit toString() in Strings umwandeln.

StringBuilder sb1 = new StringBuilder( "www.tutego.de" );
StringBuilder sb2 = new StringBuilder( "www.tutego.de" );
System.out.println( sb1.equals( sb2 ) ); // false
System.out.println( sb1.toString().equals( sb2.toString() ) ); // true
System.out.println( sb1.toString().contentEquals( sb2 ) ); // true


Rheinwerk Computing - Zum Seitenanfang

4.6.8 hashCode() bei StringBuilder/StringBuffer *Zur vorigen Überschrift

Die obige Betrachtung zeigt, dass eine Methode equals(), die den Inhalt von StringBuilder/StringBuffer-Objekten vergleicht, nicht schlecht wäre. Dennoch besteht das Problem, wann StringBuilder/StringBuffer-Objekte als gleich angesehen werden sollen. Das ist interessant, denn StringBuilder/StringBuffer-Objekte sind nicht nur durch ihren Inhalt bestimmt, sondern auch durch die Größe ihres internen Puffers, also durch ihre Kapazität. Sollte equals() den Rückgabewert true haben, wenn die Inhalte gleich sind, oder nur dann, wenn Inhalt und Puffergröße gleich sind? Da jeder Entwickler andere Ansichten über die Gleichheit besitzt, bleibt es bei dem standardmäßigen Test auf identische Objektreferenzen.

Eine ähnliche Argumentation gilt bei der hashCode()-Methode, die für alle inhaltsgleichen Objekte denselben, im Idealfall eindeutigen Zahlenwert liefert. Die Klasse String besitzt eine hashCode()-Methode, doch StringBuilder/StringBuffer erbt die Implementierung aus der Klasse Object unverändert. Mit anderen Worten: Die Klassen selbst bieten keine Implementierung an.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 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.


[Rheinwerk Computing]

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