Datentypen - megloff.ch

Werbung
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
Herunterladen