Informatik

Die Klasse String

Für Verschlüsselungsverfahren spielt die Klasse String eine große Rolle, da in der Regel Zeichen durch andere Zeichen ersetzt werden.

Daher werden wir zunächst lernen wie wir die Klasse String verwenden können.

Wir reduzieren uns dabei auf Methoden, die in den Vorgaben des Zentralabiturs stehen. Denn mit diesen Methoden wird im Zentralabitur ein sicherer Umgang erwartet.

Was ist ein String?

Doch zunächst schauen wir uns an was eigentlich ein sogenannter String ist. Deutlich wird dies, wenn wir den deutschen Begriff verwenden: Zeichenkette, Zeichenfolge oder auch Zeichenreihe.

Hieraus können wir schon ableiten, dass ein String sich aus mehreren Zeichen zusammensetzt.

Schauen wir uns also den Aufbau der Klasse String an, dann stellen wir fest, dass die Klasse sozusagen nur Methoden für ein Array des Datentyps char bereitstellt.


// Auszug aus der Java-String-Klasse (siehe https://hg.openjdk.org/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l114)
public final class String {
    private final char value[];
    private int hash;

    // ...

    public String() {
        this.value = new char[0];
    }

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

    // ...

    public int length() {
        return value.length;
    }

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }

        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;

            if (n == anotherString.value.length) {

                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;

                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    // ...
}

Bis jetzt haben wir noch nie den Konstruktor der Klasse String verwendet, um ein neues String-Objekt zu erzeugen, sondern wir haben einfach String a = "Hallo"; in unseren Quelltext geschrieben. Das ist ein sogenanntes String-Literal, welches durch die Anführungszeichen kenntlich gemacht wird.

String ist nicht gleich String

Wir haben schon gesehen, dass der Datentyp String ein Referenzdatentyp (Klassentyp) ist. Das heißt, dass Strings in Java Objekte sind. Also enthält eine Variable vom Referenztyp String nicht die Zeichenkette selbst, sondern die Speicheradresse eines Objektes der Klasse String oder die Nullreferenz (null).

Das hat Folgen für den Vergleich von String.

String in Java werden vom Compiler stark optimiert, sodass zum Beispiel nicht immer ein neues String-Objekt erzeugt wird, sondern manchmal auch auf ein bestehendes String-Objekt verwiesen wird. Deshalb ist manchmal der direkte Verweis der Referenzen wahr, machnmal aber auch nicht, obwohl das String-Objekt, die gleiche Zeichenkette enthält.

Damit dieses Problem nicht auftritt, sollte man immer die Methode equals verwenden, um zwei String-Objekt miteinander zu vergleichen.

Abiturrelevante Methoden

Jetzt, da wir verstehen, wie die Klasse String aufgebaut ist, schauen wir uns alle abiturrelevante Methoden an.

Aufgabe: StringUtils

Gegeben ist das nachfolgende Implementationsdiagramm der Klasse StringUtils.

  1. Erstelle ein neues EduGit-Repository mit dem Namen "frglib-dein-name" (z.B. frglib-mike) und nutze das folgende BlueJ-Projekt als Vorlage

BlueJ-Projekt: frglib

  1. Überführe das Implementationsdiagramm in Java Quellcode
  2. Implementiere die Methode setWord
  3. Implementiere die Methode distanceTo nutze dazu das nachfolgende Struktogramm.
  1. Implementiere die Methode reverse
  2. Implementiere die Methode isParlindrome
  3. Teste deine Implementierung, indem du "Tests starten" in BlueJ ausführst. Füge gegenenfalls neue Tests in der Klasse StringUtilsTest hinzu.

Klassendokumentation StringUtils

setWord(pWord)

Der Auftrag setzt den Wert des Attributs word auf pWord.

distanceTo(pWord)

Der Auftrag liefert die Distanz zwischen word und pWord zurück. Die Distanz soll dabei die Anzahl an verschiedenen Stellen der beiden Strings sein.

reverse()

Die Anfrage kehrt die Zeichen von word um und gibt den neuen String zurück.

isParlindrome()

Die Anfrage gibt zurück, ob der String ein Parlindrome ist.