5.5 Elementare Java-Klassen 5.5.1 String

Transcrição

5.5 Elementare Java-Klassen 5.5.1 String
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