Java Programmierung mit Eine Einführung > Datentypen Mark Egloff 2006 1 Java Programmierung mit Lernziel Heute Abend > Einfache und abstrakten Datentypen verstehen. Variabeln, Konstanten, Literale verwenden können. Datentypumwandlungen sowie Wrapperklassen anwenden. Mark Egloff 2006 2 Java Programmierung mit Datentypen > Was ist ein Datentyp ? > > > Jeder Wert hat ein reservierter Speicherbereich und belegt eine feste Anzahl von Byte(s). Alle Variablen (und auch Ausdrücke) haben einen Typ, der zur Übersetzungszeit (Kompilierung) bekannt ist Der Typ definiert die Grösse des Speichers und dessen Format. Es gibt primitive und abstrakte Datentypen z.B.: x = y + z Wert: 4012 15 1. Byte (LSB) = 172 2. Byte (MSB) = 15 Mark Egloff 2006 LSB 172 0 2 4 6 Adressen MSB 3 Java Programmierung mit Primitive Datentypen > Primitive Datentypen werden auch einfache Datentypen oder elementare Datentypen genannt. > Sie bestehen aus einer festen Anzahl von Bytes und können nur bestimmte Wertebereiche und Formate aufnehmen. > Eine Instanz eines solchen einfachen Datentyps nennt man Variable oder Literale > Da jede Variable einen festen Datentyp hat und diesen nicht mehr ändern kann, zählt Java zu den streng typisierten Sprachen. Mark Egloff 2006 4 Java Programmierung mit Primitive Datentypen in Java Datentyp: Zahlenbereich: Speicher: Verwendung: boolean true, false 1 Bit Logische Zustände char UNICODE; 216-1; 0-65535 2 Byte Buchstaben byte -27 bis 27-1; -128 bis +127 1 Byte ganze Zahlen short -215 bis 215-1; -32'768 bis +32'767 2 Byte ganze Zahlen int -2 31 bis 231-1; -2'147'483'648 bis +2'147'483'647 4 Byte ganze Zahlen long -263 bis 263-1 -9'223'372'036'854'775'808 bis +9'223'372'036'854'775'807 8 Byte ganze Zahlen float ±1.40239846*10-45 bis ±3.40282347*1038 4 Byte Gleitkommazahlen (IEEE 754) double ±4.94065645841246544*10-324 bis ±1.79769313486231570*10308 8 Byte Gleitkommazahlen (IEEE 754) (String) UNICODE variabel Zeichenketten Mark Egloff 2006 5 Java Programmierung mit Primitive Datentypen in Java Literale Literale sind konstante Ausdrücke. Es sind Werte ohne einen Bezeichner. Auch diese besitzen einen Datentyp. Verschiedene Literale in Java: > > Die Wahrheitswerte true und false Integrale Literale für Zahlen, etwa 12 oder –32 > > Zeichenliterale, etwa 'X' oder '\n' Gleitkommaliterale: 12.567 oder –9.999E-2 > Stringliterale für Zeichenketten wie "Paolo Pinkas" z.B.: String name = "Hans Müller"; double d = 3.24 * f; if ( e == true ) ... Mark Egloff 2006 6 Java Programmierung mit Primitive Datentypen in Java Wahrheits-Typ „boolean“ > Der Datentyp boolean beschreibt einen Wahrheits-wert, der entweder true oder false ist. > Die Zeichenketten true und false sind reservierte Wörter und sind so genannte Literale. > Kein anderer Wert ist für Wahrheitswerte möglich, insbesondere werden numerische Werte nicht als Wahrheitsweite interpretiert. > Nicht initialisierte Variablen dieses Typs sind false z.B.: boolean b = true; boolean c; boolean falsch = 0; Mark Egloff 2006 compilerfehler 7 Java Programmierung mit Primitive Datentypen in Java Ganzzahlige Typen: hexadezimales, oktales Zahlensystem > Ganzzahlige Werte können in Java entweder in dezimal, oktaler oder hexadezimaler Weise geschrieben werden > Oktale Werte beginnen mit einer „0“ (null). Ziffern 0-7 z.B. oktal 012 dezimal 10 > Hexadezimale Werte beginnen mit „0x“. Ziffern 0-9,A-F z.B. hexadezimal 0x1F = dezimal 31 z.B.: int i=1243, j=01230, k=0xcafebabe; oktal Mark Egloff 2006 hex 8 Java Programmierung mit Primitive Datentypen in Java Ganzzahliger Typ „Long“ : grosser Integer (-263 bis 263-1) > Ein Literal für Ganzzahlen doppelter Größe wird mit einem »l« oder »L« am Ende versehen. > Ansonsten würde der Compiler es als Integer ansehen und falls der Wert zu gross wäre als Fehler ansehen z.B.: long l = 123456789098l, long m = –1; long n = 0xC0B0L; -1 ist gültig für int long o = 12345678901; if ( o < 9999999999 ) {…} System.out.println(12345678901); Mark Egloff 2006 compilerfehler compilerfehler compilerfehler 9 Java Programmierung mit Primitive Datentypen in Java Ganzzahlige Typen: Überläufe Passt das Ergebnis einer Berechnung nicht in den Wertebereich eines Typs, so wird dieser Fehler nicht vom System angezeigt; weder der Compiler noch die Laufzeitumgebung melden dieses Problem. z.B.: Literale haben als Standardtyp Integer System.out.println(100000*100000 / 100000); 14100 !!! int int int System.out.println(100000L*100000 / 100000); 100000 long int int Mark Egloff 2006 10 Java Programmierung mit Primitive Datentypen in Java Dezimal Typ „float“ und „double“ > Java unterscheidet Fließkommazahlen einfacher Genauigkeit (float) und doppelter Genauigkeit (double). > Standardmäßig sind die Literale vom Typ double. Ein nachgestelltes »f« (oder »F«) zeigt an, dass es sich um ein float handelt. > Zur Darstellung der Fließkomma-Literale gibt es zwei Notationen: Standard und Wissenschaftlich (Exponential) z.B.: double pi = 3.1415, k = .001, x = 3.01e+8; float z = 123.45f, y = 3.00E+8F; float falsch = 199.99; float richtig = 199.99f; Mark Egloff 2006 compilerfehler 11 Java Programmierung mit Primitive Datentypen in Java Alphanumerische Zeichen „char“ und „String“ > Ein einzelnes Zeichen ist vom Typ „char“ und wird in einzelnen Hochkommas eingeschlossen > Ein String dient zur Aufnahme von mehreren Zeichen und wird in doppelte Anführungszeichen eingeschlossen > String selbst ist eigentlich eine Klasse (ein abstrakter Datentyp) und zählt streng genommen nicht zu den primitiven Datentypen z.B.: char c = 'a'; String s = "Heut' schon gemeckert?"; char falsch = "w"; String auchFalsch = 'wow'; Mark Egloff 2006 compilerfehler compilerfehler 12 Java Programmierung mit Primitive Datentypen in Java Escape-Sequenzen (Steuerzeichen) > Escape-Sequenzen sind Zeichenkombinationen, die man für die Darstellung von nicht direkt angebbaren Zeichen verwendet. Auszug von Steuerzeichen: Zeichen Bedeutung: z.B.: \n Zeilenschaltung (Newline) \r Wagenrücklauf (Carriage return) \t Horizontaler Tabulator \' \" Einfaches und doppeltes Anführungszeichen \\ Backslash String s = "1.Zeile \n 2.Zeile"; String a = "und er sagte:\"Hallo\""; Mark Egloff 2006 13 Java Programmierung mit Primitive Datentypen in Java Die Typanpassung (das Casting) > Möglicherweise kommt es vor, dass Datentypen konvertiert werden müssen z.B „float“ in „int“. Dies nennt sich Typanpassung (engl. typecast) oder auch casten. Java unterscheidet zwei Arten der Typanpassung: > > Automatische (implizite, ad hoc) Typanpassung. Daten eines kleineren Datentyps werden automatisch dem größeren angepasst. Explizite Typanpassung. Ein größerer Typ kann einem kleineren Typ mit möglichem Verlust von Informationen zugewiesen werden. Mark Egloff 2006 14 Java Programmierung mit Primitive Datentypen in Java Automatisches Casting (implizites, ad hoc) > > > > Existieren in einer Operation verschiedene Datentypen so werden automatisch die „kleineren“ in die Größeren überführt. Der Compiler nimmt diese selbstständig vor Die Anpassung wird im Englischen auch „widening conversion“ genannt, weil sie den Wertebereich automatisch erweitert. Wird auch implizites oder „ad hoc“ casting genannt byte short , char int long float double Boolean Ausdrücke (true, false) lassen sich nicht in andere Elementare Datentypen umwandeln Mark Egloff 2006 15 Java Programmierung mit Primitive Datentypen in Java Explizites Casting > > > Die explizite Anpassung engt einen Typ ein, sodass diese Operation auch „narrowing conversion“ genannt wird. Der gewünschte Typ für eine Typanpassung wird vor den umzuwandelnden Datentyp geschrieben. Der gewollte Datentyp ist geklammert. Es kann dabei zu Informationsverlust kommen !!! Syntax: (neuer Datentyp) Ausdruck; z.B.: Umwandlung in Ganzzahl: int n = (int) 3.1415; System.out.println(n); 3 !!! Umwandlung in byte: byte b = (byte)255667; System.out.println(b); -77 !!! Mark Egloff 2006 16 Java Programmierung mit Primitive Datentypen in Java Explizites Casting > Bei der expliziten Typumwandlung von double und float in einen Ganzzahltyp verwendet Java eine Rundung immer gegen 0. > Das Vorzeichen wird dabei beibehalten z.B.: System.out.println( (int) +12.34 ); System.out.println( (int) +67.89 ); System.out.println( (int) –12.34 ); Mark Egloff 2006 // 12 // 67 // –12 17 Java Programmierung mit Primitive Datentypen in Java Explizites Casting > Bei der Konvertierung eines größeren Ganzzahltyps in einen kleineren werden einfach die oberen Bits abgeschnitten. > Eine Anpassung des Vorzeichens findet nicht statt. z.B.: Umwandlung von „int“ in „short“ int ii = 123456789; // 00000111010110111100110100010101 short si = (short) ii; // 1100110100010101 System.out.println(si); // –13035 int ij = –123456; // 11111111111111100001110111000000 short sj = (short) ij; // 0001110111000000 System.out.println(sj); // 7616 Mark Egloff 2006 18 Java Programmierung mit Variabeln in Java > Mit Variablen lassen sich Daten speichern, die vom Programm gelesen und geschrieben werden können. Um Variablen zu nutzen, müssen sie zuvor deklariert oder definiert werden. > Variablen sind Instanzen eines primitiven Datentyps > Die Schreibweise einer Variablendeklaration ist immer die gleiche: Hinter dem Typ folgt der Name der Variablen, gefolgt von einem optionalen Initialwert. Syntax: z.B.: Datentyp Bezeichner [= wert]; long myLongVar = 22; boolean b = false; int j; Mark Egloff 2006 19 Java Programmierung mit Variabeln in Java Namenskonvention für Variabeln > Das 1. Zeichen des Bezeichners (Namen) muss mit einem Buchstaben oder mit ‚_‘ oder mit ‚$‘ erfolgen. (Zahlen sind nicht erlaubt !) > Ab dem 1. Zeichen dürfen dann Buchstaben Ziffern folgen. Auch ‚_‘ und ‚$‘. Aber keine Operatorzeichen (‚+‘‚-‘ etc.) > Schlüsselwörter von JAVA (z.B. class, int, for static etc. ) sind als Bezeichner nicht erlaubt ! Mark Egloff 2006 20 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Variable > Jede Variable hat einen Geltungsbereich (engl. Scope), auch Lebensdauer genannt. Sie ist nur in dem Block lebendig, in dem sie definiert wurde. > Eine Variable wird in Java immer innerhalb eines Blocks (Klasse, Methode, Schleife,…) deklariert z.B. Gültigkeits bereich public class MyClass { public static void main (…) { long myLongVar = 22; String text = "aaa bbb ccc"; int i; } } Mark Egloff 2006 21 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Variable Java kennt 3 Arten: > Instanz Variabeln (Objektvariablen / Attribute ) > Klassen Variablen (Statische Variable) > Lokale Variablen Je nach Ort wo die Variable deklariert ist, ist deren Zugehörigkeit und somit ihre Handhabung anders ! Mark Egloff 2006 22 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Variable public class HelloWorld { public int i = 3; public static String stri; public void method() { byte j = 0; } } InstanzVariable KlassenVariable Lokale Variable Ausserhalb von Klassen können keine Variabeln angelegt werden. Mark Egloff 2006 23 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Instanz Variable > Instanz- oder Objekt-Variable ist and das Objekt gebunden. Wird für jedes Objekt separat angelegt. Nur innerhalb von ObjektMethoden (= nicht static) sowie über Objekt selbst anwendbar. public class HelloWorld { public int i = 3; InstanzVariable public static void main(String[] args) { System.out.println(i); } compilerfehler public void objMethod() { System.out.println(i); } } Mark Egloff 2006 24 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Static Variable > Klassen- oder Static-Variable ist eine Globale-Variable, Sie existiert nur einmal. Kann falls sie „public“ ist, überall aufgerufen und genutzt werden. Klasse dient nur als Namespace public class HelloWorld { public static int i = 3; KlassenVariable public static void main(String[] args) { System.out.println(i); } public void objMethod() { System.out.println(i); } } Mark Egloff 2006 25 Java Programmierung mit Variabeln in Java Gültigkeitsbereich (Sichtbarkeit) einer Lokalen Variable > Lokale Variablen sind nur innerhalb der Methode bzw. des Blocks z.B. Schleife anwendbar. public class HelloWorld { public static void main(String[] args) { int i = 3; LokaleVariable { int j = 3; } System.out.println(i); System.out.println(j); compilerfehler }} Mark Egloff 2006 LokaleVariable in Block 26 Java Programmierung mit Variabeln in Java Initialisieren von lokalen Variabeln > Objektvariablen (und statische Variablen) werden automatisch mit einem Nullwert initialisiert. Lokalen Variablen hingegen nicht, diese müssen wir selbst initialisieren. > Wird versucht von nicht-initialisierten Variabeln zu lesen, endet dies in einem Compilerfehler z.B. public static void main( String[] args ) { int i = 3, williWurm; System.out.println(i); System.out.println(williWurm); if (williWurm == 1) { … } williWurm += 2; } Mark Egloff 2006 compilerfehler compilerfehler compilerfehler 27 Java Programmierung mit Variabeln in Java Konstante Variabeln > Konstante sind Variabeln und Objekte deren Wert nicht mehr geändert werden kann. > Sie werden mit dem zusätzlichen Schlüsselwort „final“ deklariert > Konstanten müssen immer initialisiert werden. z.B. public class MyClass { public static void main( String[] args ) { final double PI = 3.14; System.out.println(PI); PI = 3.1415; final E; }} Mark Egloff 2006 compilerfehler compilerfehler 28 Java Programmierung mit Abstrakte Datentypen > Abstrakte Datentypen sind Klassen, sie werden auch als Komplexe Datentypen bezeichnet. > Eine Klasse definiert ein neuer Typ. Es sind zusammengesetzte Datentypen welche aus primitiven oder weiteren Klassen bestehen (Gruppierung). > Eine Instanz eines solchen Datentyps bzw. Klasse nennt man Objekt z.B. einfache Klasse welche aus anderen Datentypen besteht class MyClass { int myIntAttribut; String myStringAttribut; } Mark Egloff 2006 29 Java Programmierung mit Abstrakte Datentypen > Klassen besitzen gegenüber anderen Datentypen Methoden. Dabei wird zwischen Statischen Methoden (welche unabhängig vom Objekt sind) sowie zwischen Objekt-Methoden unterschieden > Klassen gibt es in Java in Hülle und Fülle und sie bilden die Grundlage des Java API‘s java.sun.com/j2se/1.5.0/docs/api/ z.B. erstellen eines neuen String Objekts und Aufruf Objekt-Methode String strObj = new String("Java ist einfach"); System.out.println( strObj.length() ); // 16 System.out.println("Java".length()); // 4 z.B. Aufruf einer Static Methode von Klasse String (Java 1.5) String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", new java.util.Calendar()); Mark Egloff 2006 30 Java Programmierung mit Abstrakte Datentypen Wrapperklassen Abstrakter Datentyp primitiver Datentyp > Abstrakten Datentypen können nicht direkt für Mathematische / Logische Operationen verwendet werden. Dies erfordert stets einen primitiven Typ. > Es wurden deshalb Wrapperklassen geschaffen, die es erlauben primitive Datentypen als Klassen und Objekte handzuhaben > Die Hauptaufgabe der Wrapperklasse ist es eine Variable in ein Objekt zu überführen und umgekehrt. z.B. Erstellen eines Integer Objektes und Wandelung in „int“ Integer iObj = new Integer(3021); int i = iObj.intValue(); Mark Egloff 2006 31 Java Programmierung mit Abstrakte Datentypen Wrapperklassen > Für jeden primitiven Datentyp gibt es seine spezifische Wrapperklasse. Beschreibung am besten im Java Doc nachlesen Elem. Datentyp Wrapper Klasse boolean java.lang.Boolean byte java.lang.Byte short java.lang.Short int java.lang.Integer long java.lang.Long float java.lang.Float double java.lang.Double char java.lang.Character Mark Egloff 2006 32 Java Programmierung mit Abstrakte Datentypen Wrapperklassen > Weiter bieten Wrapperklassen spezielle Hilfsmethoden um z.B. den grösstmöglichsten Wert zu ermitteln oder einen String in den jeweiligen Datentyp zu wandeln. z.B. String in „int“ wandeln, Aufruf einer Static Methode try { int i = Integer.parseInt("3021"); } catch(Exception ex){ System.err.println(ex); } z.B. „int“ Wert in Hex Notation ausgeben, Aufruf einer Static Methode int i = 3021; String s = Integer.toHexString(i); System.out.println(s); // 0x0BCD Mark Egloff 2006 33 Java Programmierung mit Eine Einführung > Ausdrücke, Operanden und Operatoren Mark Egloff 2006 34 Java Programmierung mit Lernziel Heute Abend > Bedeutung eines Ausdrucks verstehen und auswerten können > Operatoren in Java kennen. Bedeutung von Priorität und Assoziativität verstehen und anwenden können Mark Egloff 2006 35 Java Programmierung mit Ausdrücke > Ein Ausdruck (engl. Expression) ergibt bei der Auswertung ein Ergebnis. Dieser Wert wird auch Resultat genannt. > Ausdrücke haben immer einen Wert, während das für Anweisungen (wie eine Schleife) nicht gilt. Daher kann ein Ausdruck an allen Stellen stehen, an denen ein Wert benötigt wird. Java kennt nur 2 Arten von Ausdrücken bzw. Werten > numerischer Typ (von arithmetischen Ausdrücken) oder ein > Referenztyp (etwa von einer Objekt-Erzeugung). Mark Egloff 2006 36 Java Programmierung mit Operatoren > Operatoren erlauben die Verbindung von einzelnen Ausdrücken zu neuen Ausdrücken. > Einige Operatoren sind aus der Schule bekannt, wie Addition, Vergleich, Zuweisung und Weitere. > Operatoren verknüpfen die Operanden. > Operatoren haben eine Priorität (z.B. Punktrechnung vor Strichrechnungen) und ein eine Assoziativität (Zuordnungsfolge) Beispiele einiger Operatoren int a = -2; double celsius = ( fahrenheit – 32 ) * 5 / 9; int i = – – – 2 + – + 3; System.out.println(5 % 3); System.out.println(A && B || C); Mark Egloff 2006 37 Java Programmierung mit Operatoren > arithmetische +, - , *, /, % > zuweisung =, +=, -=, /=, %= > Inkrement / Dekrement ++, -- > bit arithmetische &, |, ^, ~ > bit verschiebung << , >>, >>> > bit zuweisung &=, |=, ^=, <<=, >>= , >>>= > Vergleich ==, !=, <,>, <=, >= > logischer Vergleich &&, ||, ! > KurzAbfrage ?, : > Casting (Datentyp) > Typ test instanceof Mark Egloff 2006 38 Java Programmierung mit Operatoren Die Arten von Operatoren > Ist ein Operator auf genau einem Operand definiert, so nennt er sich unärer Operator (oder einstelliger Operator). z.B. negativ > Die üblichen Operatoren Plus, Minus, Mal und Division sind binäre (zweistellige) Operatoren. > Es gibt auch einen Fragezeichenoperator für bedingte Ausdrücke, der ternär (dreistellig) ist. Beispiele unär / binäre Operatoren int a = - 2; // unär double celsius = fahrenheit – 32; // binär int i = test()? 33 : 0; // ternär Mark Egloff 2006 39 Java Programmierung mit Operatoren Die Priorität & Assoziativität bei Operatoren > Jeder Operator hat eine Priorität. Sie definiert in welcher Reihenfolge die Operationen ausgewertet werden. > Assoziativität bedeutet Verknüpfung oder Zuordnung. Es bestimmt in welcher Reihenfolge der Operand seine Operanden auswertet > Man unterscheidet zwischen links „L“ und rechts „R“ Assoziativität Beispiele Rechts / Links - Assoziativität int a = j + - i + - v; // Vorzeichen hat R.Assoz. double c = d + f – 32; // Minus hat L.Assoz. Mark Egloff 2006 40 Java Programmierung mit Operatoren Die Priorität & Assoziativität bei Operatoren Beispiel 1: w = x + y * z; 1. Operator ‚*‘ : L Assoz. 2. Operator ‚+‘ : L Assoz. 3. Operator ‚=‘ : R Assoz. Lösung: w = ( x + (y * z)); Mark Egloff 2006 41 Java Programmierung mit Operatoren Die Priorität & Assoziativität bei Operatoren Beispiel 2: w = x + y << ~z * 3; 1. Operator ‚~‘ : R Assoz. 2. Operator ‚*‘ : L Assoz. 3. Operator ‚+‘ : L Assoz. 4. Operator ‚<<‘: L Assoz. 5. Operator ‚=‘ : R Assoz. Lösung: w = ((x + y) << ((~z) * 3)); Mark Egloff 2006 42 Java Programmierung mit Abstrakte Datentypen > Handhabung von Strings in Java Mark Egloff 2006 43 Java Programmierung mit Lernziel Heute Abend > Bedeutung der Begriffes „String“, „Encoding“ und „Unicode“ verstehen > Verstehen wie Text in Java gehandhabt wird und worauf hierbei geachtet werden muss > Die wesentlichen String-Klassen kennen und anwenden können Mark Egloff 2006 44 Java Programmierung mit Strings in Java Strings , Encoding und Unicode > Ein String ist eine Sammlung von Zeichen, die im Speicher geordnet abgelegt werden. > Der Computer arbeitet intern mit Zahlen deshalb muss jedes Zeichen auf einen eindeutigen Code abgebildet werden. Dieses Mapping wird auch Encoding genannt. Es gibt hierzu verschiedene Standards z.B. ASCII, EBCDIC oder den Unicode > Java verwendet für das Encoding hierzu intern den 16 Bit (2 Byte pro Zeichen) Unicode-Standard. Beispiele Ausgabe des Mapping- Codes eines Zeichens char c = 'A'; int i = (int) c; System.out.println(i); // 65; Mark Egloff 2006 45 Java Programmierung mit Strings in Java Der Standard UNICODE > UNICODE ist ein internationaler Standard, www.unicode.org für eine einheitliche Codierung von Schriftzeichen in allen Sprachen > Wenn von "Unicode" gesprochen wird, ist meist der Zeichensatz UCS-2 gemeint. Die ersten 256 der 65.536 Zeichen des UCS-2 entsprechen den Zeichen des Zeichensatzes "ISO Latin-1" (ISO 8859-1); > Der Unicode-Zeichensatz ist in mehrere Ebenen (Engl.: "Planes") unterteilt. In dieser Ebene werden 16 Bit (zwei Byte) zur Kodierung jedes Zeichens verwendet; Mark Egloff 2006 46 Java Programmierung mit Strings in Java Strings und deren Anwendung > Java sieht drei Klassen vor, die Zeichenfolgen von der Implementierung abstrahieren. Die Klassen entsprechen der idealen Umsetzung der objektorientierten Idee. Die Daten werden gekapselt und sind nur über Methoden zugreifbar. Klasse Verwendung java.lang.String Immutable Klasse für Konstante Zeichenketten (einmalige Verwendung) java.lang.StringBuffer dynamische, beliebig änderbare Zeichenketten ausgelegt für Multi-threading java.lang.StringBuilder (seit Java 1.5) dynamische, beliebig änderbare Zeichenketten nicht für Multi-threading geeignet Mark Egloff 2006 47 Java Programmierung mit Strings in Java Die Klasse „java.lang.String“ > Die Klasse „String“ dient dazu um ein Text-Literal als Objekt abzubilden. > Die Klasse besitzt zahlreiche nützliche Methoden um mit Text arbeiten zu können. java.sun.com/j2se/1.5.0/docs/api/String.html Beispiele einiger String Methoden String s = "Java ist einfach!"; int i = s.length(); char c = s.charAt(2); String a = s.substring(5,7); int j = s.indexOf("ist"); String b = s.replace(' ','_'); Mark Egloff 2006 Erzeugung String Länge: 17 'v' "ist" 5 Ersetzung 48 Java Programmierung mit Strings in Java Die Klasse „java.lang.String“ > In Java ist eine Symbiose zwischen String als Objekt und eingebauten Datentyp vorgenommen worden. Wir können direkt Text Literale als Objekte ansprechen, es ist kein „new“ nötig um ein Objekt zu erzeugen, auch der „+“ Operator kann für Verkettung von Strings verwendet werden z.B. erstellen eines neuen String Objekts mit oder ohne „new“ String str1 = new String("Java ist einfach!"); String str2 = "Java ist einfach!"; z.B. String Literal als Objekt ansprechen, Methode aufrufen System.out.println("Java".lenght()); z.B. Verkettung von Strings String str1 = "Java..."; String str2 = str1 + "ist einfach!"; Mark Egloff 2006 49 Java Programmierung mit Strings in Java Die Klasse „java.lang.String“ In Java sollten Objektinhalte untereinander nicht mit dem Operator „==“ auf Gleichheit geprüft werden. „==“ macht nur Vergleich auf Referenz Beispiel Vergleich mit „==“ und Methode „equals()“ String s1 = new String("Hallo"); String s2 = new String("Hallo"); System.out.println( s1 == s2 ); System.out.println( s1.equals(s2) ); Mark Egloff 2006 false ! true 50 Java Programmierung mit Strings in Java Die Klasse „java.lang.String“ > Bei allen Klassen sowie auch bei String muss beim Vergleich der Inhalte die Objekt-Methode „equals()“ oder „compare()“ verwendet werden! „equals()“ : prüft ob der Inhalt eines String gleich dem anderen ist „equalsIgnoreCase()“: prüft auf Gleichheit aber ohne CaseSensitive „compareTo()“: prüft die alphabetische Sortierreihenfolge und gibt die Distanz der Positionen zurück String s1 = new String("Hallo"); String s2 = new String("First"); System.out.println( s1.equals(s2) ); System.out.println( s1.copmareTo(s2)); System.out.println( s2.copmareTo(s1)); Mark Egloff 2006 false -2 2 51 Java Programmierung mit Strings in Java Die Klasse „java.lang.String“ > Die Klasse ist „Immutable“, was „unveränderlich“ bedeutet, Das so erzeugte Objekt kann danach nicht mehr verändert werden. Es kann nur einmal Zeichen aufgenommen werden. > Alle Methoden der Klasse „String“ verändern das Objekt nachträglich nicht, bei jeder Operation wird ein neues Objekt erzeugt > Auch bei jeder Verkettung „+“ wird ein neues Objekt erzeugt! Performance Einbussung falls viele String Operationen! Beispiel Aufruf einer Methode und neues Objekt String s = "Java ist einfach!"; System.out.println(s.toUpperCase()); neues Objekt System.out.println(s); unverändert Mark Egloff 2006 52 Java Programmierung mit Strings in Java Die Klasse „java.lang.StringBuffer“ > Die Klasse „StringBuffer“ dient dazu um grössere Menge an Text effizient zu verarbeiten java.sun.com/j2se/1.5.0/docs/api/StringBuffer.html > Anders als bei der Klasse String können die Zeichen verändert, hinzugefügt und gelöscht werden ohne ein neues Objekt jeweils zu erzeugen > „new“ muss verwendet werden und der „+“ wird nicht unterstützt z.B.: Erzeugung, Anhängung und Ersetzung mit StringBuffer StringBuffer sb = new StringBuffer("Java ist"); sb.append(" einfach!"); sb.replace(' ','_'); String s = sb.toString(); Wandelung in String „Java_ist_einfach!“ Mark Egloff 2006 53 Java Programmierung mit Strings in Java Die Klasse „java.lang.StringBuilder“ > Seit Java 1.5 gibt es eine neue String-Klasse: “StringBuilder“ > Sie besitzt alle Eigenschaften wie „StringBuffer“. Einziger Unterschied: StringBuffer ist synchronized, unterstützt Multi-Threading StringBuilder unterstützt kein Multi-Threading ist dadurch schneller aber sollte nicht in solchen Anwendungen eingesetzt werden z.B.: Erzeugung, Anhängung und Ersetzung mit StringBuilder StringBuilder sb = new StringBuilder("Java ist"); sb.append(" einfach!"); String s = sb.toString(); Wandelung in String „Java ist einfach!“ Mark Egloff 2006 54 Java Programmierung mit Strings in Java Java und Encoding > Java verwendet für das Encoding intern den UnicodeStandard. Mit der Aussenwelt (Eingabe per Tastatur oder Dateien) verwendet Java ein Default Encoding und wandelt die internen Zeichencodes auf dieses um > Damit Java mit der Aussenwelt (anderen Applikationen) kommunizieren kann (z.B. Daten per Tastatur oder via einer Datei einlesen), muss das Encoding richtig gesetzt sein! > Zu Beginn passiert es oft dass das Mapping nicht immer stimmt und es kommt somit gerade bei Spezialzeichen wie „ ä / ö / ü“ zu Problemen Mark Egloff 2006 55 Java Programmierung mit Strings in Java Java und Encoding z.B.: Ausgabe von „ä / ö / ü“ in der MS Eingabeaufforderung DOS public class HelloWorld { public static void main(String[] args) { System.out.println("Hüt abig hämmer Java!"); }} C:\Test>java HelloWorld H³t abig hõmmer Java! Das Encoding von DOS und Java Appl. ist nicht gleich! Mark Egloff 2006 56 Java Programmierung mit Strings in Java Das Encoding muss bei allen Applikationen gleich sein ‚Ü‘ =0xDC Mapping Zeichen Satz iso Datei Mapping ‚Ü‘ =0xDC ‚3‘ =0xDC Applikation 1 X1§1§3 Sddfdfdfg Gfdgf fdgdfgfgdfgdx Zeichen Satz utf Zeichen Satz iso X1§1§3 Sddfdfdfg Gfdgf fdgdfgfgdfgdx Zeichen Satz utf Applikation 2 Mark Egloff 2006 Zeichen Satz cp850 X1§1§3 Sddfdfdfg Gfdgf fdgdfgfgdfgdx Zeichen Satz cp512 Applikation 3 ‚Ü‘ =0xDC 57 Java Programmierung mit Strings in Java Java und Encoding > Für Windows verwendet Java das Default Encoding „Cp512“ (Windows Latin-1) richtig für Windows Applikationen > Bei DOS verwendet Windows oft das Cp850 (MS-DOS Latin-1) was leider „etwas“ unterschiedlich zu Cp512 ist. > Beim Start des Java Interpreters kann ein spezieller Übergabeparameter gesetzt werden um das Default Encoding anzugeben „java –Dfile.encoding=Cp850 MyAppClass“. > Auch bei DOS bzw. für jede Andere Applikation kann das Encoding gesetzt werden z.B. mit dem Befehl „chcp“ Entweder bei Java oder beim DOS muss nun das richtige Encoding gesetzt werden! Mark Egloff 2006 58 Java Programmierung mit Strings in Java Java und Encoding Lösung 1: Encoding beim Java Interpreter mittels Parameter setzen C:\Test>java –Dfile.encoding=Cp850 HelloWorld Hüt abig hämmer Java! Mark Egloff 2006 59 Java Programmierung mit Strings in Java Java und Encoding Lösung 2: Encoding in DOS selber setzen mittels Befehl „chcp“ C:\Test>chcp 1252 Aktive Codepage: 1252. C:\Test>java HelloWorld Hüt abig hämmer Java! Mark Egloff 2006 60