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.5 Konvertieren zwischen Primitiven und StringsZur nächsten Überschrift

Bevor ein Datentyp auf dem Bildschirm ausgegeben, zum Drucker geschickt oder in einer ASCII-Datei gespeichert werden kann, muss das Java-Programm ihn in einen String konvertieren. Wenn wir etwa die Zahl 7 ohne Umwandlung ausgäben, hätten wir keine 7 auf dem Bildschirm, sondern einen Pieps aus dem Lautsprecher – je nach Implementierung. Auch umgekehrt ist eine Konvertierung wichtig: Gibt der Benutzer in einem Dialog sein Alter an, ist das zuerst immer ein String. Diesen muss die Anwendung in einem zweiten Schritt in eine Ganzzahl konvertieren, um etwa eine Altersabfrage zu realisieren.


Rheinwerk Computing - Zum Seitenanfang

4.5.1 Unterschiedliche Typen in String-Repräsentationen konvertierenZur nächsten ÜberschriftZur vorigen Überschrift

Die statischen überladenen String.valueOf()-Methoden liefern die String-Repräsentation eines primitiven Werts oder eines Objekts.

Beispiel

Konvertierungen einiger Datentypen in Strings:

String s1 = String.valueOf( 10 );                    // 10
String s2 = String.valueOf( Math.PI ); // 3.141592653589793
String s3 = String.valueOf( 1 < 2 ); // true

Die valueOf()-Methode ist überladen, und insgesamt gibt es für jeden primitiven Datentyp eine Implementierung:

final class java.lang.String
implements CharSequence, Comparable<String>, Serializable
  • static String valueOf(boolean b)
  • static String valueOf(char c)
  • static String valueOf(double d)
  • static String valueOf(float f)
  • static String valueOf(int i)
  • static String valueOf(long l)
    Liefert die String-Repräsentation der primtiven Elemente.
  • static String valueOf(char[] data)
  • static String valueOf(char[] data, int offset, int count)
    Liefert vom char-Feld oder einem Ausschnitt des char-Feldes ein String-Objekt.

Die Methode valueOf(Object)

Der valueOf()-Methode kann auch ein beliebiges Objekt übergeben werden:

Beispiel

Konvertierungen einiger Objekte in String-Repräsentationen:

String r = String.valueOf( new java.awt.Point() );  // java.awt.Point[x=0,y=0]
String s = String.valueOf( new java.io.File(".") ); // .
String t = String.valueOf( new java.util.Date() ); // Tue Jul 20 13:07:16 CEST 2010

Da jedes Objekt eine toString()-Methode besitzt, ruft valueOf() diese einfach auf. Das heißt, die String-Umsetzung wird einfach an das Objekt delegiert.

Implementierung von String.valueOf(Object)

public static String valueOf( Object obj )
{
return (obj == null) ? "null" : obj.toString();
}
Die Sonderbehandlung testet, ob null übergeben wurde, und liefert dann einen gültigen String mit dem Inhalt "null".

Da String.valueOf(null) die Rückgabe »null« liefert, gibt auch eine Ausgabe wie System.out.println(null) den String »null« auf der Konsole aus, denn println() ruft intern String.valueOf() auf. Genauso ergibt System.out.println(null + "0") die Ausgabe "null0", da null als Glied in der Additionskette steht.

final class java.lang.String
implements CharSequence, Comparable<String>, Serializable
  • static String valueOf(Object obj)
    Ist obj ungleich null, liefert die Methode obj.toString(), andernfalls die Rückgabe »null«.

Rheinwerk Computing - Zum Seitenanfang

4.5.2 Stringinhalt in einen primitiven Wert konvertierenZur nächsten ÜberschriftZur vorigen Überschrift

Für das Parsen eines Strings – zum Beispiel von "123" aus einer Benutzereingabe in die Ganzzahl 123 – ist nicht die Klasse String verantwortlich, sondern spezielle Klassen, die für jeden primitiven Datentyp vorhanden sind. Die Klassen deklarieren statische parseXXX()-Methoden, wie die folgende Tabelle zeigt:

Tabelle 4.7: Methoden zum Konvertieren eines Strings in einen primitiven Typ

Klasse Konvertierungsmethode Rückgabetyp
java.lang.Boolean parseBoolean( String s ) boolean
java.lang.Byte parseByte( String s ) byte
java.lang.Short parseShort( String s ) short
java.lang.Integer parseInt( String s ) int
java.lang.Long parseLong( String s ) long
java.lang.Double parseDouble( String s ) double
java.lang.Float parseFloat( String s ) float

Für jeden primitiven Typ gibt es eine sogenannte Wrapper-Klasse mit parseXXX()-Konvertiermethoden. Die Bedeutung der Klassen erklärt Abschnitt 8.2 »Wrapper-Klassen und Autoboxing«, genauer. An dieser Stelle betrachten wir nur die Konvertierfunktionalität.

Die Methode Double.parseDouble() wollen wir in einem Beispiel nutzen. Der Benutzer soll in einem grafischen Dialog nach einer Fließkommazahl gefragt werden, und von dieser Zahl soll dann der Sinus und Kosinus auf dem Bildschirm ausgegeben werden:

Listing 4.8: SinusAndCosinus.java

import javax.swing.JOptionPane;

public class SinusAndCosinus
{
public static void main( String[] args )
{
String s = JOptionPane.showInputDialog( "Bitte Zahl eingeben" );
double value = Double.parseDouble( s );
System.out.println( "Sinus: " + Math.sin( value ) );
System.out.println( "Kosinus: " + Math.cos( value ) );
}
}

parseXXX() und mögliche NumberFormatException-Fehler

Kann eine parseXXX()-Methode eine Konvertierung nicht durchführen, weil sich ein String wie "1lala2lö" eben nicht konvertieren lässt, löst sie eine NumberFormatException aus. Das ist auch der Fall, wenn parseDouble() als Dezimaltrenner ein Komma statt eines Punktes empfängt. Bei der statischen Methode parseBoolean() ist die Groß-/Kleinschreibung irrelevant.

Hinweis

Dieser NumberFormatException-Fehler kann als Test dienen, ob eine Zeichenkette eine Zahl enthält oder nicht, denn eine Prüfmethode wie Integer.isInteger() gibt es nicht. Eine Alternative ist, einen regulären Ausdruck zu verwenden – diese Variante wird später in Abschnitt 4.8 vorgestellt.

parseXXX() und Leerzeichen *

Die statische Konvertierungsmethode parseInt() schneidet keine Leerzeichen ab und würde einen Parserfehler melden, wenn der String etwa mit einem Leerzeichen endet. (Die Helden der Java-Bibliothek haben allerdings bei Float.parseFloat() und Double.parseDouble() anders gedacht: Hier wird die Zeichenkette vorher schlank getrimmt.)

Beispiel

Leerzeichen zur Konvertierung einer Ganzzahl abschneiden:

String s = " 1234    ".trim();            // s = "1234"
int i = Integer.parseInt( s ); // i = 1234

Das, was bei einem String.valueOf() als Ergebnis erscheint – und das ist auch das, worauf zum Beispiel System.out.print() basiert –, kann parseXXX() wieder in den gleichen Wert zurückverwandeln.

Hinweis

Eine Methode Character.parseCharacter(String) fehlt. Eine vergleichbare Realisierung ist, auf das erste Zeichen eines Strings zuzugreifen, etwa so: char c = s.charAt(0).


Rheinwerk Computing - Zum Seitenanfang

4.5.3 String-Repräsentation im Format Binär, Hex, Oktal *Zur nächsten ÜberschriftZur vorigen Überschrift

Neben den überladenen statischen String.valueOf(primitive)-Methoden, die eine Zahl als String-Repräsentation im vertrauten Dezimalsystem liefern, und den parseXXX()-Umkehrmethoden der Wrapper-Klassen gibt es weitere Methoden zum Konvertieren und Parsen in der

  • binären (Basis 2)
  • oktalen (Basis 8)
  • hexadezimalen (Basis 16)
  • und in der Darstellung einer beliebigen Basis (bis 36).

Die Methoden zum Bilden der String-Repräsentation sind nicht an String, sondern zusammen mit Methoden zum Parsen an den Klassen Integer und Long festgemacht.

String-Repräsentationen aufbauen

Zum einen gibt es in den Klassen Integer und Long die allgemeinen Klassenmethoden toString(int i, int radix) für einen beliebigen Radix, und zum anderen gibt es Spezialmethoden für den Radix 2, 8 und 16.

final class java.lang.Integer
extends Number
implements Comparable<Integer>, Serializable
  • static String toBinaryString(int i)
  • static String toOctalString(int i)
  • static String toHexString(int)
    Erzeugt eine Binärrepräsentation (Basis 2), Oktalzahlrepräsentation (Basis 8) beziehungsweise Hexadezimalrepräsentation (Basis 16) der vorzeichenlosen Zahl.
  • static String toString(int i, int radix)
    Erzeugt eine String-Repräsentation der Zahl zur angegebenen Basis.
final class java.lang.Long
extends Number
implements Comparable<Long>, Serializable
  • static String toBinaryString(long i)
  • static String toOctalString(long i)
  • static String toHexString(long i)
    Erzeugt eine Binärrepräsentation (Basis 2), Oktalzahlrepräsentation (Basis 8) beziehungsweise Hexadezimalrepräsentation (Basis 16) der vorzeichenlosen Zahl. Achtung: Wenn die Zahl negativ ist, wird i ohne Vorzeichen behandelt und 2^32 addiert.
  • static String toString(long i, int radix)
    Erzeugt eine String-Repräsentation der Zahl zur angegebenen Basis. Negative Zahlen bekommen auch ein negatives Vorzeichen.

Der Parametertyp ist int beziehungsweise long und nicht byte. Dies führt zu Ausgaben, die einkalkuliert werden müssen. Genauso werden führende Nullen grundsätzlich nicht mit ausgegeben.

Tabelle 4.8: Beispiele für die toHexString()-Methode

Anweisung Ergebnis
Integer.toHexString(15) f
Integer.toHexString(16) 10
Integer.toHexString(127) 7f
Integer.toHexString(128) 80
Integer.toHexString(255) ff
Integer.toHexString(256) 100
Integer.toHexString(-1) ffffffff

Die Ausgaben mit printf() beziehungsweise die Formatierung mit String.format() bieten eine Alternative, die später vorgestellt wird.

Hinweis

Eine Konvertierung mit toHexString(x) ist bei negativen Zahlen nicht die gleiche wie mit toString(x, 16):

System.out.println( Integer.toHexString( –10 ) );  // fffffff6
System.out.println( Integer.toString( –10, 16 ) ); // -a

Hier kommt bei toHexString() zum Tragen, was als Bemerkung in der Java-Dokumentation angegeben ist, nämlich dass bei negativen Zahlen die Zahl ohne Vorzeichen genommen wird (also 10) und dann 2^32 addiert wird. Bei toString() und einem beliebigen Radix ist das nicht so.

Parsen von String mit Radix

Eine Methode zum Konvertieren eines Strings in eine Ganzzahl-Methode für eine gegebene Basis findet sich in den Klassen Integer und Long:

  • Integer.parseInt( String s, int radix )
  • Long.parseLong( String s, int radix )

Einige Anwendungsfälle:

Tabelle 4.9: Beispiele für Integer.parseInt() mit unterschiedlichen Zahlenbasen

Konvertierungsaufruf Ergebnis
parseInt("0", 10) 0
parseInt("473", 10) 473
parseInt("-0", 10) 0
parseInt("-FF", 16) 255
parseInt("1100110", 2) 102
parseInt("2147483647", 10) 2147483647
parseInt("-2147483648", 10) 2147483648
parseInt("2147483648", 10) Fehler throws NumberFormatException
parseInt("99", 8) Fehler throws NumberFormatException
parseInt("Papa", 10) Fehler throws NumberFormatException
parseInt("Papa", 27) 500050
Beispiel

Der Radix geht bis 36 (zehn Ziffern und 26 Kleinbuchstaben). Mit Radix 36 können zum Beispiel ganzzahlige IDs kompakter dargestellt werden, als wenn sie dezimal wären:

String string = Long.toString( 2656437647773L, 36 );
System.out.println( string ); // xwcmdz8d
long parseInt = Long.parseLong( string, 36 );
System.out.println( parseInt ); // 2656437647773

Im Fall von String-Konvertierung existieren für die Standard-Basen 2, 8 und 16 spezielle Methoden wie toHexString(), aber zum Parsen gibt es sie nicht. Eine Hexadezimalzahl wird daher mit parseInt(s, 16) verarbeitet, aber eine Methode wie parseHex(String) steht nicht bereit.

Nur in den Klassen Integer und Long gibt es die Unterstützung für eine Basis auch ungleich 10:

final class java.lang.Integer
extends Number
implements Comparable<Integer>, Serializable
  • static int parseInt(String s)
  • static int parseInt(String s, int radix)
final class java.lang.Long
extends Number
implements Comparable<Long>, Serializable
  • static long parseLong(String s)
  • static long parseLong(String s, int radix)
Hinweis

Die Methoden parseInt() und parseLong() verhalten sich bei der String-Repräsentation von negativen Zahlen nicht so, wie zu erwarten wäre:

System.out.println( Integer.parseInt( "7fffffff", 16 ) ); // 2147483647
System.out.println( Integer.parseInt( "80000000", 16 ) ); // Fehler Number-FormatException

0x7fffffff ist die größte darstellbare positive int-Zahl. Statt bei 0x80000000 den Wert –2147483648 zu liefern, gibt es aber eine NumberFormatException. Die Java-API-Dokumentation gibt zwar auch dieses Beispiel an, stellt dieses Verhalten aber nicht besonders klar. Es gibt den Fall, dass bei negativen Zahlen und parseInt()/parseLong() auch ein Minus als Vorzeichen angegeben werden muss. Die parseXXX()-Methoden sind also keine Umkehrmethoden zu etwa toHexString(), aber immer zu toString(): System.out.println( Integer.toString( –2147483648, 16 ) ); // –80000000
System.out.println( Integer.parseInt( "-80000000", 16 ) ); // –2147483648



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