5.5 Elementare Java-Klassen 5.5.1 String 5.5.2 Arrays 5.5.3 Object Informatik I – Java © Klaus Hinrichs 5.5.1 5-116 String • Zeichenketten werden durch Objekte der Klasse String dargestellt. String ist kein primitiver Typ, sondern eine vordefinierte Klasse! • String ist eine besondere Klasse, da Literale (konstante Zeichenketten) und Operatoren (+ zur Konkatenation) definiert sind. • In enger Verbindung mit der Klasse String steht die Klasse StringBuffer. • String und StringBuffer gehören zum package java.lang. © Klaus Hinrichs Informatik I – Java 5-117 Klasse String • Warum zwei String Klassen? "The Java development environment provides two classes that store and manipulate character data: String, for constant strings, and StringBuffer, for strings that can change. You use Strings when you don't want the value of the string to change. For example, if you write a method that requires string data and the method is not going to modify the string in any way, use a String object. Typically, you'll want to use Strings to pass character data into methods and return character data from methods. Because they are constants, Strings are typically cheaper than StringBuffers and they can be shared. So it's important to use Strings when they're appropriate.“ (aus dem Java Tutorial) © Klaus Hinrichs Informatik I – Java 5-118 Einige Methoden der Klasse String • Konstruktoren: public String(char chars[]) konvertiert Array von Zeichen in einen String. public String(byte bytes[]) konvertiert Array von Bytes in einen String, benutzt plattformspezifische Zeicheninterpretation. public String(StringBuffer buffer) konvertiert StringBuffer nach String • Beispiel: char[] c = {'S', 'c', 'h', 'u', 'l', 'z', 'e'}; String s = new String(c); System.out.println(s); Ausgabe: Schulze © Klaus Hinrichs Informatik I – Java 5-119 Einige Methoden der Klasse String • Erzeugen von String-Objekten: String vorname = new String("Max"); String nachname = "Mustermann"; (Kurz-Form mit Literal) • Rückgabe der Länge: int laenge = nachname.length(); ! 10 © Klaus Hinrichs Informatik I – Java 5-120 Methoden der Klasse String • Aneinanderhängen (Konkatenation): String name = vorname + nachname; (neues String-Objekt) • Der + Operator verknüpft zwei Objekte der Klasse String. • Ist nur einer der Operanden ein Objekt der Klasse String, und der andere ein primitiver Datentyp, wird letzterer nach String gewandelt. • Beispiel: int alter = 27; System.out.println(" Alter: " + alter + " Jahre"); Ausgabe: Alter: 27 Jahre © Klaus Hinrichs Informatik I – Java 5-121 Methoden der Klasse String • Vergleichen mit anderem Objekt: public boolean equals(Object anObject) – Vergleicht String mit einem anderen Objekt auf Gleichheit. – Typ Object heißt, daß Objekte aller Klassen als Argument übergeben werden dürfen (später mehr). – Operator == vergleicht nur, ob die Referenzen identisch sind, also ob es sich um dasselbe Objekt handelt, und nicht, ob sie inhaltlich identisch sind. © Klaus Hinrichs Informatik I – Java 5-122 Methoden der Klasse String • Beispiel: String vn = "Max"; String vorname = new String("Max"); boolean istGleich = vorname.equals(vn); ! true Achtung: == vergleicht Referenzen beider Seiten miteinander! boolean identischeRef = (vorname == vn); ! false • Beispiel: String s1 = "Test", s2 String s3 = "Te", s4 = s5 = s3 + s4; System.out.println((s1 System.out.println((s1 System.out.println((s1 = s1; "st", s5; == s2) + " / " + s1.equals(s2)); == s3) + " / " + s1.equals(s3)); == s5) + " / " + s1.equals(s5)); Ausgabe: true / true false / false false / true © Klaus Hinrichs Informatik I – Java 5-123 Methoden der Klasse String public int length() • Gibt Länge des Strings zurück public byte[] getBytes() • Konvertiert String in Array von Bytes • Benutzt plattformspezifische Zeicheninterpretation public int compareTo(String anotherString) • vergleicht zwei Zeichenketten lexikographisch basierend auf UnicodeWert eines jeden Zeichens (Telefonbuchordnung) • Ergebnis ist – gleich 0, falls Strings identisch sind – kleiner 0, falls der String lexikographisch kleiner ist als das Argument – größer 0, falls der String lexikographisch größer ist als das Argument © Klaus Hinrichs Informatik I – Java 5-124 Methoden der Klasse String public String toLowerCase() public String toUpperCase() • konvertiert String in Kleinbuchstaben bzw. Großbuchstaben • Funktioniert auch mit deutschen Umlauten • ß wird bei toUpperCase nach SS gewandelt, Rückwandlung funktioniert hier natürlich nicht © Klaus Hinrichs Informatik I – Java 5-125 String und StringBuffer • String ist nur zur Verarbeitung sich nicht ändernder Zeichenketten geeignet, denn z.B. bei Stringkonkatenation durch + wird ein neues Objekt erzeugt, und die kompletten alten Inhalte werden kopiert. • Müssen an eine Zeichenkette laufend kleine Teilzeichenketten angefügt werden, so ist StringBuffer besser geeignet. • StringBuffer hat ein initiales Fassungsvermögen; falls mehr benötigt wird, wird StringBuffer automatisch erweitert. • Bei realistischer Voreinschätzung der benötigten Länge läßt sich die Effizienz steigern. © Klaus Hinrichs Informatik I – Java 5-126 String und StringBuffer • Konstruktoren für StringBuffer: public StringBuffer() Erzeugt Leerstring mit initialem Fassungsvermögen von 16 Zeichen. public StringBuffer(int length) Erzeugt Leerstring mit spezifiziertem initialem Fassungsvermögen. public StringBuffer(String str) Initialisiert StringBuffer mit vorgegebenem String. © Klaus Hinrichs Informatik I – Java 5-127 Methoden der Klasse StringBuffer • Methoden für StringBuffer: public StringBuffer insert(int offset, String str) Fügt eine Zeichenkette in den StringBuffer nach dem durch offset gegebenen Zeichen ein: StringBuffer sb = new StringBuffer("Drink Java!"); sb.insert(6, "Hot "); System.out.println(sb.toString()); Ausgabe: Drink Hot Java! © Klaus Hinrichs Informatik I – Java 5-128 Methoden der Klasse StringBuffer public StringBuffer append(String str) Hängt eine Zeichenkette an den StringBuffer an, das Fassungsvermögen wird dynamisch an die benötigten Gegebenheiten angepaßt: StringBuffer sb = new StringBuffer("Drink Hot"); sb.append("!"); System.out.println(sb.toString()); Ausgabe: Drink Hot! © Klaus Hinrichs Informatik I – Java 5-129 Methoden der Klasse StringBuffer public int length() Gibt die Länge der aktuellen Zeichenkette zurück (nicht des aktuellen Fassungsvermögens) public String toString() Wandlung in eine Zeichenkette vom Typ String Umkehren eines String-Objektes: public String reverseIt(String source) { int i, len = source.length(); StringBuffer dest = new StringBuffer(len); for (i = (len - 1); i >= 0; i--) { dest.append(source.charAt(i)); } return dest.toString(); } © Klaus Hinrichs Informatik I – Java 5-130 String, Referenzen public class Person { private String vorname, nachname, strasse, plz, ort; public Person(String vorname, String nachname, String strasse, String plz, String ort) { setzeName(vorname,nachname); setzeAdresse(strasse, plz, ort); } public void setzeName(String vorname, String nachname) { this.vorname = vorname; this.nachname= nachname; } public void setzeAdresse(String strasse, String plz, String ort) { this.strasse = strasse; this.plz = plz; this.ort = ort; } © Klaus Hinrichs Informatik I – Java 5-131 String, Referenzen public String holeInhaber() { return (this.vorname + " " + this.nachname + ", " + this.strasse + ", " + this.plz + " " + this.ort); } } public class TestPerson { public static void main(String[] args) { Person pers = new Person("Karl", "Meyer", "Salzstrasse 11", "48149", "Muenster"); System.out.println(pers.holeInhaber()); pers.setzeAdresse("Yorkring 95", "48149","Muenster"); System.out.println(pers.holeInhaber()); } } Ausgabe: Karl Meyer, Salzstrasse 11, 48149 Muenster Karl Meyer, Yorkring 95, 48149 Muenster © Klaus Hinrichs Informatik I – Java 5-132 5.5.2 Arrays • array: A collection of data items, all of the same type, in which each item's position is uniquely designated by an integer. • Objekte für den Umgang mit Folgen von Objekten • Deklaration: Typ[] Arrayname; alternativ: Typ Arrayname[]; • Initialisierung mit Größenangabe: Arrayname = new Typ[Size]; • Initialisierung mit Werten: Arrayname = new Typ[]{Konst1, Konst2, ... , Konstn}; • Zusammenfassung von Deklaration und Initialisierung: Typ[] Arrayname = new Typ[Size]; Typ[] Arrayname = {Konst1, Konst2, ... , Konstn}; • Typ kann ein primitiver Datentyp oder auch eine Klasse sein. © Klaus Hinrichs Informatik I – Java 5-133 Eindimensionale Arrays • Zugriff auf Arrayelemente über Index, der bei 0 beginnt: Arrayname[Index]; Index ist eine Zahl vom Typ int zwischen 0 und Size-1 • Zugriff auf Arraylänge: Arrayname.length • Beispiel: Girokonto[] konten; ... konten = new Girokonto[100]; ... • Belegen der Arrayelemente: konten[0] = ...; konten[1] = ...; • Zugreifen auf ein einzelnes Array-Objekt mittels Index: konten[2] ergibt das Girokonto-Objekt an der 3. Array-Position • Es können mehrere Referenzen auf ein Array zeigen. Informatik I – Java © Klaus Hinrichs 5-134 Anwendung: Sortieren durch Einfügen • Problem: Eine unsortierte Folge von Zahlen soll geordnet werden. Dazu sollen die Zahlen zunächst in einem Array int[] zahlen; abgelegt werden, das anschließend aufsteigend sortiert werden soll. • Idee: Sind für einen Indexwert i bereits die Elemente zahlen[0], …, zahlen[i-1] aufsteigend sortiert, so suche man im bereits sortierten Bereich die Position k, an der zahlen[i] eingefügt werden kann, verschiebe zahlen[k], …, zahlen[i-1] um genau eine Position weiter auf die Elemente zahlen[k+1], …, zahlen[i] und setze zahlen[k] = zahlen[i]. 1 2 ? …! x sortiert © Klaus Hinrichs i–1 !… Informatik I – Java i x n … unsortiert 5-135 Anwendung: Sortieren durch Einfügen int[] zahlen; int merker = 0, k = 0; // Einlesen der Elemente ... for (int i = 0; i < zahlen.length; i++) { k = 0; while ((k < i) & (zahlen[i] >= zahlen[k])) k++; if (k != i) { merker = zahlen[i]; for (int j = i; j > k; j--) zahlen[j] = zahlen[j-1]; zahlen[k] = merker; } } // Ausgeben des sortierten Arrays ... © Klaus Hinrichs Informatik I – Java 5-136 Mehrdimensionale Arrays • Mehrdimensionale Arrays möglich: int[][] dreieck; dreieck = {{1},{2,3},{4,5,6}}; dreieck[1][0] ergibt 2 • dreieck[1].length liefert die Ausdehnung der zweiten Dimension in Abhängigkeit von der ersten Dimension, hier also 2, die Anzahl der Spalten der zweiten Zeile (denn die wird durch den Index [1] referenziert. © Klaus Hinrichs Informatik I – Java 5-137 Mehrdimensionale Arrays • Deklaration: Typ[][] Arrayname; // 2-dimensional Typ[][][] Arrayname; // 3-dimensional alternativ: Typ Arrayname[][]; • Initialisierung: Arrayname = new Typ[Size1][Size2]; oder (für nicht notwendigerweise rechteckige Arrays): Arrayname = new Typ[Size][]; for (int i = 0; i < Size; i++) Arrayname[i] = new Typ[Size_i]; © Klaus Hinrichs Informatik I – Java 5-138 Mehrdimensionale Arrays • Deklaration mit Initialisierung: Typ[][] Arrayname = new Typ[Size1][Size2]; Typ[][] Arrayname = {{Konst1,Konst2,…},{…},…}; • Zugriff auf Arrayelemente: Arrayname[Index1][Index2] • Arrayname ist Referenz auf das n-dimensionale Array • Arrayname[Index1] ist Referenz auf ein (n–1)-dimensionales Teilarray • Arrayname.length ist die äußere Arraylänge • Arrayname[Index].length ist die Arraylänge auf der nächsttieferen Ebene © Klaus Hinrichs Informatik I – Java 5-139 Mehrdimensionale Arrays • Beispiel: int abteilungsAnzahl = 4; int[] abteilungsGröße = {6, 17, 13, 14}; String[][] mitarbeiter = new String[abteilungsAnzahl][]; for (int i= 0; i < abteilungsAnzahl; i++) mitarbeiter[i] = new String[abteilungsGröße[i]]; mitarbeiter[0][0] = "Max Born"; // Abteilung 1 mitarbeiter[0][1] = "Werner Heisenberg"; //...(6 Leute) mitarbeiter[1][0] = "Albert Einstein"; // Abteilung 2 mitarbeiter[1][1] = "Nils Bohr"; © Klaus Hinrichs //... Informatik I – Java 5-140 Mehrdimensionale Arrays • Beispiel: Ausgabe 2-dimensionaler Arrays float[][] matrix = new float[4][4]; setupMatrix(matrix); // Eingabe der Werte for (int y = 0; y < matrix.length; y++){ for (int x = 0; x < matrix[y].length; x++) System.out.print(matrix[y][x] + " "); System.out.println(); // Zeilenvorschub } © Klaus Hinrichs Informatik I – Java 5-141 5.5.3 Object • Die Klasse Object ist die Oberklasse aller Klassen und stellt diverse Methoden zur Verfügung: – – – – public String toString() konvertiert ein Objekt in eine String-Darstellung sollte in abgeleiteten Klassen überschrieben werden Die System.out.println-Methode akzeptiert beliebige Objekte als Argument, sie benutzt die (eventuell überschriebene) toString()-Methode Strings können mit beliebigen Objekten durch den + -Operator verknüpft werden. Dazu wird implizit von den Objekten die toString()-Methode aufgerufen, um die String-Darstellung zu erhalten. © Klaus Hinrichs Informatik I – Java 5-142 Die Klasse Object public boolean equals(Object obj) – Das Objekt und das Argument werden auf Gleichheit überprüft. – In der Standardimplementierung wird nur die Referenz verglichen (also, ob es sich um dasselbe Objekt handelt). – Eine neue Methode sollte die equals-Methode überdecken, um einen inhaltlichen Vergleich zu ermöglichen. • Beispiel: Für einen Kunden soll abgefragt werden, ob er bereits Kunde ist. Für den Vergleich spielt der Name, der Geburtsort und das Geburtsdatum eine Rolle, nicht jedoch die Adresse. © Klaus Hinrichs Informatik I – Java 5-143 Die Klasse Object public Object clone() – gibt eine wertegleiche Kopie des Objektes zurück. – Hinweis: Wenn in dem zu klonenden Objekt Referenzen auf andere Objekte (z.B. Arrays) vorkommen, so werden die Referenzen geklont, nicht aber die referenzierten Objekte. Auf diese Weise kommt es zu "shared data". Ob das beabsichtigt ist, muß sorgfältig geprüft werden. public final Class getclass() – gibt das Objekt zurück, das die Klasse des Objektes repräsentiert, dessen Methode aufgerufen wird. © Klaus Hinrichs Informatik I – Java 5-144