Programmieren in Java - uni- · PDF fileint realSize = size * 2; return new int [realSize]; } Name: Patrick Förster ... •Testen Sie Ihre Heap-Logik Programmieren in Java 22

Embed Size (px)

Citation preview

  • 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