1. Aufbau des Speichers
Jeder Computer hat Arbeitsspeicher. Was ist das eigentlich, welche Eigenschaften hat er und vor allem: Welchen Nutzen haben wir davon?
Jedes Programm (einschließlich der in Java geschriebenen Programme) wird vor der Ausführung in den Arbeitsspeicher geladen. Im Arbeitsspeicher befinden sich der Programmcode (den der Prozessor ausführt) und die Programmdaten (die das Programm selbst in den Speicher schreibt).
Was ist Arbeitsspeicher und womit lässt er sich vergleichen?
Stellen Sie sich Excel vor 😎 Ein Excel-Blatt besteht aus Zellen, und jede Zelle hat ihre eindeutige Nummer (A1, A2, ... B1, B2). Kennt man die Nummer der Zelle, kann man immer einen Wert in sie schreiben oder den darin gespeicherten Wert auslesen. Der Speicher eines Computers ist ähnlich aufgebaut.

Programm und Daten werden während der Ausführung im Speicher gehalten. Der gesamte Speicher des Computers ist als viele kleine Zellen dargestellt – Bytes. Jede Zelle hat ihre eindeutige Nummer – 0, 1, 2, 3, ... (die Nummerierung beginnt bei 0). Wenn wir die Zellnummer kennen, können wir Daten in diese Zelle schreiben oder aus ihr lesen. In manchen Zellen liegt der Programmcode – eine Folge von Befehlen für den Prozessor, in anderen – die Daten dieses Programms. Die Zellnummer nennt man auch die Adresse der Zelle.
Der Prozessor kann Befehle aus dem in den Speicher geladenen Programm ausführen. Fast alle Befehle des Prozessors sind sinngemäß: Daten aus einigen Zellen holen → etwas damit tun → das Ergebnis in andere Zellen schreiben.
Durch das Kombinieren hunderter einfacher Befehle entstehen komplexe und nützliche Operationen.
Wenn im Programmcode eine Variable deklariert wird, wird für sie ein Stück noch nicht verwendeten Speichers reserviert. Üblicherweise sind das einige Bytes. Bei der Deklaration einer Variable muss man den Typ der Informationen angeben, die das Programm darin speichern wird: Zahlen, Text oder andere Daten. Ohne Kenntnis des Typs ist nicht klar, wie groß der Speicherblock für die Variable sein muss.
In den Anfangstagen der Informatik arbeiteten Programme direkt mit den Nummern der Speicherzellen, später gab man den Zellen der Bequemlichkeit halber Namen. Ein eindeutiger Variablenname ist in erster Linie für die Programmierer gedacht: Zur Laufzeit käme das Programm auch nur mit Nummern gut zurecht.
2. Variablen im Speicher
In Java gibt es vier elementare Datentypen zur Speicherung ganzzahliger Werte. Das sind byte, short, int und long.
| Typ | Größe, Byte | Namensherkunft |
|---|---|---|
|
|
Byte, da er ein Byte Speicher belegt |
|
|
Kurzform von Short Integer |
|
|
Kurzform von Integer |
|
|
Kurzform von Long Integer |
Außerdem gibt es in Java zwei Gleitkomma-Typen – float und double:
| Typ | Größe, Byte | Namensherkunft |
|---|---|---|
|
|
Kurzform von Floating Point Number |
|
|
Kurzform von Double Float |
Jedes Mal, wenn die Programmausführung auf eine Variablendeklaration trifft, wird ein kleiner Speicherbereich zugewiesen (die Größe hängt vom Typ der Variablen ab).
Als Adresse einer Variablen gilt die Adresse der ersten Zelle des für sie reservierten Speicherblocks.
Java-Programmen ist der direkte Zugriff auf den Speicher verboten. Jegliche Arbeit mit dem Speicher erfolgt ausschließlich über die Java Virtual Machine (JVM).
3. Der Typ String im Speicher
Der Typ String kann große Datenmengen speichern, daher ist er nicht nur ein Datentyp, sondern ein vollwertiges Objekt.
Die eigentlichen Daten des Typs String (Text) werden in einem speziellen Objekt abgelegt, für das Speicher reserviert wird, und die Adresse dieses Objekts wird in der Variablen gespeichert, für die ebenfalls Speicher reserviert wird.

- Die Variable a vom Typ int belegt 4 Byte und speichert den Wert 1.
- Die Variable b vom Typ int belegt 4 Byte und speichert den Wert 10,555. Das Komma ist hier kein Dezimalteil, sondern die Tausendertrennung. Der Dezimalteil wird durch einen Punkt getrennt.
- Die Variable d vom Typ double belegt 8 Byte und speichert den Wert 13.001.
- Die Variable str vom Typ String speichert den Wert D12 – die Adresse der ersten Zelle des Objekts, das den Text enthält.
Das Objekt vom Typ String (das den Text enthält) wird in einem separaten Speicherblock gehalten. Die Adresse seiner ersten Zelle wird in der Variablen str gespeichert.
4. Was passiert bei einer Zuweisung
Noch ein wichtiger Punkt – wie eine Zuweisung funktioniert. Zum Beispiel:
int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10
In diesem Beispiel entstehen im Speicher zwei Zellen: eine für a, eine für b. Wenn wir b = a; schreiben, wird der Wert kopiert (10), nicht das „Kästchen“ selbst. Änderungen an b beeinflussen a in keiner Weise.
Nun ähnlich, aber mit Strings:
String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"
Hier verweisen beide Variablen s1 und s2 bis zum Zeitpunkt der Änderung auf denselben String "Hello". Wenn wir jedoch s2 = s2 + " World"; ausführen, wird für s2 ein neuer String "Hello World" erzeugt, während s1 weiterhin auf den alten String "Hello" zeigt.
5. Warum in der Programmierung fast alles bei Null gezählt wird
Viele wundern sich, warum in der Programmierung fast überall bei Null gezählt wird. Es gibt sehr viele Situationen, in denen es bequemer ist, bei Null zu beginnen (es gibt allerdings auch Fälle, in denen das Zählen ab 1 bequemer ist).
Versuchen wir eine Analogie. Sie stehen in einer langen Warteschlange im Geschäft. Und der Kassierer sagt, alle Kunden ab dem 20. sollen bitte zur zweiten Kasse gehen. Welche Nummern haben sie? 20, 21, 22, 23, ... Logisch. Und relativ zum 20.? 0, 1, 2, 3, ...
Wenn wir eine Gruppe als „Nummer des ersten Elements“ + „Anzahl“ definieren, ergeben sich innerhalb der Gruppe die relativen Nummern +0, +1, +2, ...
In der Programmierung ist es genauso. Wenn Ihrer Variablen 100 Byte Speicher zugewiesen wurden und Sie X als Adresse des ersten Bytes haben, wie lauten dann die Adressen aller Bytes? X+0, X+1, X+2, ..., X+99. Damit erhalten wir bereits eine Gruppe von Bytes mit den Indizes 0, 1, 2, 99.
Wenn wir über die relative Adresse innerhalb eines beliebigen Datenblocks nachdenken, erhalten wir stets eine Nummerierung ab Null. Das ist der erste und zugleich häufigste Grund fürs Zählen ab Null.
GO TO FULL VERSION