Programmieren in Java - uni- · PDF fileint realSize = size * 2; return new int [realSize]; }...
Transcript of Programmieren in Java - uni- · PDF fileint realSize = size * 2; return new int [realSize]; }...
Name: Patrick Frster
Programmieren in Java Ein Projekt
Name: Patrick Frster
Wiederholung: new-Operator
Beispiele
Achtung:
Arrays und Strings knnen in Java ohne explizites new erzeugt werden
Im Falle von String ist dies sogar vorzuziehen
Die Semantik des new-Operators:
Reserviere Speicherplatz fr einen Wert des angegebenen Datentyps
2 Programmieren in Java
int[] myArray = new int[] {0, 1, 1, 2, 3, 5, 8};
String myString = new String("HELLO WORLD");
Werte nicht-primitiver Datentypen mssen mit new erzeugt werden
Es gibt keine Mglichkeit primitive Daten mit new zu erzeugen
Name: Patrick Frster
Wiederholung: Heap
Alle mit new-erzeugten Daten landen auf dem Heap-Speicher
Dieser ist nicht wie der Stack sequentiell aufgebaut
Jede beliebige Speicherzelle kann gelesen werden
Jede beliebige freie Speicherzelle kann beschrieben werden
Daten, die auf dem Heap abgelegt werden, leben losgelst von Scopes
Speicher auf dem Heap wird zur Laufzeit reserviert Reservierter Speicher bleibt solange belegt bis:
er wieder freigegeben wird
das Programm beendet wird
Natrlich ist auch der Heap-Speicher begrenzt
3 Programmieren in Java
Exception in thread "main" java.lang.OutOfMemoryError
Name: Patrick Frster
Wiederholung: Heap-Beispiel
Der Heap-Speicher war ntig, da sich folgendes Beispiel mit dem Stack nicht realisieren liee:
Die Gre des hier erzeugten Arrays ist dynamisch
Pro Eintrag in einem int-Array: 32 Bit
Es gibt n-Eintrge n-Speicherzellen
Eine zustzlicher Zelle fr die Lnge des Arrays
Die Gre wird whrend der Ausfhrung der Methode festgelegt Es gibt keine Mglichkeit vor der Ausfhrung festzustellen, wie viel Speicher die Array-Rckgabe bentigt Letzteres ist aber Voraussetzung fr den Stack
4 Programmieren in Java
static int[] createDynamicArray(int size) {
int realSize = size * 2;
return new int [realSize];
}
Name: Patrick Frster
Speicherkunde: Heap-Beispiel
5 Programmieren in Java
return new
5
realSize
5
call createDynamicArray
Stack Heap
static int[] createDynamicArray(int size) {
int realSize = size * 2;
return new int [realSize];
}
int [] myArray = createDynamicArray(5);
frei
besetzt
(5 * 2) * 32 Bit
= 10 Speicherzellen
+ 1 Zelle (Lnge)
myArray
Name: Patrick Frster
Wiederholung: Pointer
Im vorherigen Beispiel, wird der Variablen myArray die Rckgabe des Aufrufes von createDynamicArray zugewiesen
Dieser Wert liegt wie gesehen auf dem Heap Jede Speicherzelle hat eine eindeutige Referenz Auf einem 32-Bit System gibt es max. adressierbare Zellen Die Speicherzelle auf dem Heap, an welcher der Array beginnt, wird als Referenz des Arrays bezeichnet Der Wert der Variablen ist nicht der konkrete Array sondern seine Referenz Variablen, die eine Referenz kapseln werden als Pointer/Zeiger bezeichnet Per . wird auf Werte hinter einem Pointer zugegriffen (Dereferenzierung)
Beispiele:
Achtung: Der Umgang mit Referenzen ist in Java immer implizit, es gibt allerdings auch Sprachen in denen explizit mit Referenzen gearbeitet werden kann (Pointer sind also von Referenzen zu unterscheiden)
6 Programmieren in Java
4294967296232
array.length System.out.println();
Name: Patrick Frster
Der null-Pointer
Pointer-Variablen, denen keine Referenz zugewiesen ist, haben den speziellen Wert null (Schlsselwort)
Der Wert kann explizit zugwiesen werden
Wird versucht diese Variable zu Dereferenzieren so kommt es zum Fehler:
Insbesondere werden nicht primitive Arrays mit null-Werte initialisiert:
7 Programmieren in Java
String someString = null;
Exception in thread "main" java.lang.NullPointerException
String[] someArray = new String[2];
System.out.println(someArray[0]);
null
Name: Patrick Frster
Wiederholung: Call-By-Semantik
Bei einem Methodenaufruf wird ein Speicher-Frame auf dem Stack erzeugt Alle Parameterwerte werden an diesen Frame bergeben:
Primitive Parameter:
Der Aufrufwert wird kopiert
und der entsprechenden Methodenvariablen zugewiesen
nderungen haben auerhalb der Methode habe keine Auswirkung Call-By-Value
Pointer-Parameter:
Die Referenz hinter dem Aufruf-Pointer wird kopiert
und der entsprechenden Methodenvariable zugewiesen
Dereferenzierung fhrt zum gleichen Speicherbereich!
nderungen an referenzierten Daten bleiben bestehen! Call-By-Reference
8 Programmieren in Java
Name: Patrick Frster
Wiederholung: Garbage Collection
In vielen lteren Programmiersprachen war es Aufgabe des
9 Programmieren in Java
static int[] createDynamicArray(int size) {
int realSize = size * 2;
return new int [realSize];
}
int [] myArray = createDynamicArray(5);
myArray = new int [2];
frei
besetzt
Garbage-Collector
Name: Patrick Frster
Wiederholung: Garbage Collection
In vielen lteren Programmiersprachen war es Aufgabe des Programmierers, den Heap-Speicher zu verwalten Jedes mit new erzeugte Datum muss durch einen entsprechenden inversen Befehl (destroy, release, o.) wieder zerstrt werden
In Java gibt keinen Befehl zum Freigaben von Speicher Das JRE berprft zyklisch und eigenstndig den Heap auf Daten, die nicht mehr bentigt werden Wird ein solcher Datensatz gefunden, wird er entfernt Dieses Verfahren wird als Garbage Collection bezeichnet
10 Programmieren in Java
Name: Patrick Frster
Strings
String ist in Java ein zusammengesetzter Datentyp Variablen vom Typ String sind demnach Pointer D.h. String-Werte mssen per new erzeugt werden:
Analog zu Arrays gibt es eine new-lose implizite Erzeugung:
String ist in Java der einzige nicht numerische und nicht primitive Datentyp fr den der Operator + definiert ist:
Sobald ein Operand von Typ String ist, werden alle automatisch umgewandelt
11 Programmieren in Java
STRING String Bezeichner = " " ;
String String Bezeichner = new ( ) STRING " " ;
String myString = new String("Hello World");
String myString = "Hello World";
String hello = "Hello";
String world = "World";
System.out.println(hello + " " + world); Hello World
Name: Patrick Frster
Zwei Strings vergleichen (equals)
Warum equals und nicht den bekannten ==-Operator? Der ==-Operator vergleicht die Referenz, auf die der Pointer zeigt und nicht
den Wert, der an der referenzierten Speicherstelle liegt!
Mit new erzeugt, wird auf jeden Fall neuer Speicherplatz angefordert Implizit erzeugt, wird nur Speicherplatz angefordert, wenn der String zuvor
noch nie in genau gleicher Schreibweise benutzt wurde Die implizite Variante ist in jedem Fall vorzuziehen!
String-Vergleich
12 Programmieren in Java
String string1 = "Hello World";
String string2 = "hello world";
System.out.println(string1.equals(string2)); false
String string1, string2 = string1 = new String("Hello World");
String string3, string4 = string3 = "Hello World";
System.out.println(string1.equals(string2)); true
System.out.println(string3 == string4); true
System.out.println(string3.equals(string4)); true
System.out.println(string1 == string2); false
Name: Patrick Frster
Aufgabe
Legen Sie sich mit Netbeans ein neues Projekt namens Vorlesung_5 an Fgen Sie dem Projekt ein Klasse mit Namen Vorlesung_5 an
Implementieren Sie die folgende Methodensignatur
Die Methode soll zu einem numerischen String den int-Wert zurckliefern
Enthlt der String nicht ausschlielich Zahlen (mit Ausnahme eines Zeichen als ersten Buchstaben) so soll ERROR: _ZAHL_ ist keine Zahl ausgegeben werden (_ZAHL_ steht fr den bergebenen String) und -1 zurckgeliefert werden
Nutzen Sie die Code-Completion um geeignete String-Methoden zu finden
13 Programmieren in Java
static int parseInt(String string)
parseInt("1000") => 1000 parseInt("-11225") => -11225
parseInt("Hello World")
ERROR: Hello World ist keine Zahl
=> -1
Name: Patrick Frster
Projekt: Heap
Ziel ist eine interaktive Anwendung, die auf der Konsole Eingaben entgegen nimmt und diese als Operationen auf einem knstlichen Heap interpretiert
Die Umsetzung soll in zwei Teilprojekten erfolgen
14 Programmieren in Java
Name: Patrick Frster
Teilprojekt 1: Umsetzung der Heap-Logik
Ansatz:
Jede Zelle eines Heaps ist eindeutig ber eine Referenz zugreifbar
Jedes Element in einem Array ist eindeutig ber einen Index zugreifbar
Ein Array dient als Basis fr den knstlichen Heap
Als Basistyp fr den Array soll String benutzt werden.
Folgende Hilfsmethoden sollten implementiert werden:
Setzt jedes Element im Array, dass nicht == null ist auf defValue
Ausgabe eines Arrays der Form: [ELEM_1, ELEM_2, ELEM_N]
15 Programmieren in Java
static String[] initArray(String defValue, String[] array);
static void printlnArray(String[] array);
Name: Patrick Frster
Teilprojekt 1: Umsetzung der Heap-Logi