3 Häufig gepostete Fragen

3.1 [LANG] Die Sprache Java

3.2 [STRING] Strings

3.3 [IO] Eingabe/Ausgabe, Streams, etc.

3.4 [NET] Netzwerk

3.5 [AWT] Abstract Window Toolkit

3.6 [SWING] Swing, das bevorzugte GUI

3.7 [APPLET] Java-Applets und ihre Zusammenarbeit mit Browsern

3.8 [SERVER] Servlets und andere Server-Implementierungen in Java

3.9 [NONCORE] Klassen/Packages, die über den Kern der Sprache hinausgehen, also Java3D etc.

3.10 [OOP] OOP-Konzepte und Patterns in Java

3.11 [JDK] Virtuelle Maschinen, alles über JDKs und deren Installation und Verwendung

3.12 [TOOLS] Java-Zusatz-Tool, zum Beispiel IDEs, Build-Tools, Profiler, etc.

3.13 [MISC] Alles, was nicht in eine der anderen Rubriken paßt

3.14 [ERROR] Fehlermeldungen


3.2 [STRING] Strings

Zurück zu "3 Häufig gepostete Fragen"

3.2.1 Wie vergleiche ich zwei Strings in Java?

Problem:
Man versucht zwei Strings in der Form

if(stringEins == stringZwei) {
    System.out.println("stringEins und stringZwei sind gleich.");
}

zu vergleichen und erhält alles andere als ein richtiges Ergebnis.

Der Grund ist der, daß mit dem "=="-Operator nur die beiden Referenzen miteinander verglichen werden, nicht jedoch die Objekte. Man erhält deshalb womöglich auch bei zwei gleichen Strings das Ergebnis, daß sie verschieden sind. Für den inhaltlichen Vergleich, nicht nur von Strings, sondern allgemein von Objekten, wird in Java die Methode equals(Object obj) verwendet, die nicht immer nur Referenzen, sondern je nach Klasse auch die Inhalte (sprich ihre Daten) vergleicht. Obige Abfrage müßte also

if(stringEins.equals(stringZwei)) {
    System.out.println("stringEins und stringZwei sind gleich.");
}

lauten, damit das gemacht wird, was eigentlich gewünscht ist.

Im Zusammenhang mit Strings ist noch eine Besonderheit zu erwähnen:

if ("Java".equals(stringZwei)) {
    System.out.println("stringZwei ist gleich zu Java.");
}

ist zulässig, der Compiler erzeugt aus der Zeichenkette automatisch ein String-Objekt; man muß also nicht zuerst ein Objekt anlegen und den String Java dort speichern.

Autor: Markus Reitz, Martin Erren

Zurück zu "3.2 [STRING] Strings"

3.2.2 Wie wandle ich einen String in einen Integer?

Klassen können Methoden besitzen, die die Konvertierung eines Objekts dieser Klasse in ein Objekt einer anderen Klasse übernehmen. Zu dem elementaren Java-Datentyp int gibt es eine sogenannte Wrapper-Klasse Integer, die den elementaren Datentyp in einer Klasse kapselt .Diese Klasse stellt eine Methode (in diesem Fall eine Klassenmethode) zur Verfügung, die das Gewünschte leistet:

public class Test {
    public static void main (String[] params) {
        String stringMitZahl = "50";
        int zahl = Integer.parseInt(stringMitZahl);
        zahl = zahl + 10;
        System.out.println("Die Variable zahl = " + zahl);
    }
}

Autor: Markus Reitz

Zurück zu "3.2 [STRING] Strings"

3.2.3 Wie wandle ich einen Integer in einen String um?

Dieses Problem ist genau das Gegenteil des vorherigen. Wie die Klasse Integer, so besitzt auch die Klasse String eine Methode, die das Problem löst, allerdings heißt die Methode nicht parseString, was man analog schließen könnte, sondern valueOf.

public class Test {
    public static void main (String[] params) {
        int zahl = 50;
        String stringMitZahl = null;
        try {
            stringMitZahl = String.valueOf(zahl);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        System.out.println("Die Variable stringMitZahl = " +
                stringMitZahl);
    }
}

Autor: Markus Reitz

Zurück zu "3.2 [STRING] Strings"

3.2.4 Wie wandle ich einen Integer in einen HexString um?

Das Problem ist ähnlich wie das konveriteren von einem Integer in einen String. Wie die Klasse String die Klassenmethode valueOf besitzt um einen String zu erzeugen so besitzt die Klasse Integer die Klassenmethode toHexString(int i).

public class Test {
    public static void main (String[] params) {
        int zahl = 50;
        String stringAlsHex = null;
        try {
            stringAlsHex = Integer.toHexString(zahl);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        System.out.println("Die Variable stringAlsHex = " +
                           stringAlsHex);
    }
}

Der Nachteil der Integer.toHexString(int i) Methode ist das sie alle führenden Nullen einer Hex-Repräsentation abschneidet.

Autor: Uwe Günther

Zurück zu "3.2 [STRING] Strings"

3.2.5 Wie kann ich eine Zahl formatieren und wie lege ich die Anzahl der Nachkommastellen fest?

Das kann die Klasse java.text.NumberFormat und deren Abkömmlinge erledigen.

Beispiel:

import java.text.DecimalFormat;

public class Zahl {
    public static void main(String[] args) {
        double betrag = 1000d/3d; // -> 333.333333...
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.println(df.format(betrag));
        df = new DecimalFormat("#.## DM");
        System.out.println(df.format(betrag));
        df = new DecimalFormat("0000.0000");
        System.out.println(df.format(betrag));
    }
}

Die Ausgabe des Programms sind formatierte Dezimalzahlen:

333,33
333,33 DM
0333,3333

In der API-Dokumentation der Klassen java.text.Decimalformat und java.text.NumberFormat werden alle weiteren Formatierungsoptionen erläutert. Falls die Umwandlungen von double nach String zeitkritisch durchgeführt werden müssen, lohnt sich ein Blick auf http://www.onjava.com/pub/a/onjava/2000/12/15/formatting_doubles.html Dort erklärt Jack Shirazi (Autor des Buches "Java Perfomance Tuning") andere Konvertierungsmethoden.

Autor: Karsten Schulz

Zurück zu "3.2 [STRING] Strings"

3.2.6 Wie kann ich ein Datum formatieren?

Das machen andere für Dich,...

Benutze einfach die Klassen DateFormat aus dem package java.text. Folgendes Beispiel zeigt Dir die Anwendung der SimpleDateFormat-Klasse:

import java.util.Date;
import java.text.SimpleDateFormat;

public class Datum {
    public static void main(String[] args) {
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sd.format(new Date()));
        sd.applyPattern("dd.MM.yyyy");
        System.out.println(sd.format(new Date()));
    }
}

Die Ausgabe des Programms sind formatierte Datümer:

    2000-12-24
    24.12.2000

In der API-Dokumentation zur Klasse java.text.SimpleDateFormat sind die Kürzel der verschiedenen Datumskomponenten für Tag, Monat, usw. aufgeführt.

Autor: Karsten Schulz

Zurück zu "3.2 [STRING] Strings"

3.2.7 Wie kann ich in einem String oder StringBuffer mehrere Zeichen suchen und ersetzen?

Mit

    String String#replace(char,char)

kann ich nur einzelne Zeichen suchen und mit

    StringBuffer replace(int,int,String)

nur ersetzen aber nicht suchen.

Lösung:
Eine gute Hausaufgabe. Was man hier braucht, ist eine Kombination von

    int String#indexOf(String,int),
    String String#substring(int,int)

mit einem neu aufzubauenden StringBuffer.

bzw.

int StringBuffer#indexOf(String,int) StringBuffer#replace(int,int,String)

Die folgende Lösung ist eine unter vielen und ersetzt alle Vorkommen von "search" in "source" mit "replace":

public static String replaceAll(String source, String search,
                                String replace) {
    if(search.equals(replace)) {
        return source; //kann ja sein, dass wir nichts tun müssen
    }

    StringBuffer result = new StringBuffer();
    int len = search.length();
    if(len == 0) {
        return source; //verhindert Endlosschleife bei search.equals("");
    }

    int pos = 0; //position
    int nPos;    //next position
    do {
        nPos = source.indexOf(search, pos);
        if(nPos != -1) { //gefunden
            result.append(source.substring(pos, nPos));
            result.append(replace);
            pos = nPos+len;
        } else { //nicht gefunden
            result.append(source.substring(pos)); //letzter abschnitt
        }
    } while(nPos!= -1);

    return result.toString();
}

Da sowas praktisch überall gebraucht wird, gibt es unzählige Bibliothek(chen) im Netz, die so etwas anbieten, z.B.

[...vielleicht noch mehr und geeignetere Adressen...]

Autor: Martin Erren

Zurück zu "3.2 [STRING] Strings"

3.2.8 Gibt es reguläre Ausdrücke in Java (regular expressions)?

Ja, natürlich.

Bis zum J2SDK 1.4 muss man, um reguläre Ausdrücke in Java zu benutzen, auf externe packages zurückgreifen. Eines der ausgereiftesten ist das Regexp-Paket aus dem Jakarta-Projekt:

Ab dem J2SDK 1.4 wird es jedoch ein package java.util.regex geben, das somit die Möglichkeit zur Benutzung der regulären Ausdrücke direkt in die Klassenhierarchie einbaut.

Nachfolgend ein Beispiel für die Nutzung dieses packages (Achtung: funktioniert nur ab J2SDK 1.4 aufwärts!).

Das Beispielprogramm zeigt, wie in der Stringvariablen 'input' nach einem Muster (Pattern) gesucht wird, das auf einer Ziffer, mindestens einem Buchstaben und einer weiteren Ziffer besteht:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternTest {

    public static void main(String[] args) {
        String input = "Test für Regex Ausdrücke 1xxx2 n444n.";
        Pattern p = Pattern.compile("\\d\\D+\\d");
        // Muster: Ziffer, mind. ein Buchstabe, Ziffer
        Matcher m = p.matcher(input);
        if (m.find()) {
            System.out.println("Muster an Pos. " + m.start());
                System.out.println("Muster ist: " + m.group());
        } else {
            System.out.println("Muster nicht gefunden");
        }
    }
}

Die Ausgabe dieses Programms ist:

    Muster an Pos. 25
    Muster ist: 1xxx2

Weitere Infos in der API-Dokumentation zu java.util.regex.

Autor: Karsten Schulz

Zurück zu "3.2 [STRING] Strings"