1. Organisation de la mémoire
Chaque ordinateur dispose d’une mémoire vive. Qu’est-ce que c’est, quelles caractéristiques a-t-elle et, surtout, en quoi cela nous est-il utile ?
Chaque programme (y compris ceux écrits en Java) est chargé en mémoire vive avant son exécution. La mémoire vive contient le code du programme (exécuté par le processeur) et les données du programme (que le programme place lui-même en mémoire).
Qu’est-ce que la mémoire vive et à quoi ressemble-t-elle ?
Imaginez Excel 😎 Une feuille Excel est composée de cellules, et chaque cellule possède son numéro unique (A1, A2, ... B1, B2). En connaissant le numéro d’une cellule, on peut toujours y écrire une valeur ou lire la valeur qui s’y trouve. La mémoire d’un ordinateur est organisée de manière similaire.

Le programme et ses données sont stockés en mémoire pendant l’exécution. Toute la mémoire de l’ordinateur est représentée sous forme de petites cases — des octets. Chaque case a son numéro unique — 0, 1, 2, 3, ... (la numérotation commence à zéro). En connaissant le numéro de la case, nous pouvons y enregistrer des données, ou bien les en lire. Dans certaines cases se trouve le code du programme — un ensemble d’instructions pour le processeur —, dans d’autres, les données de ce programme. Le numéro d’une case est aussi appelé adresse de la case.
Le processeur sait exécuter les instructions d’un programme chargé en mémoire. Presque toutes les instructions du processeur ressemblent à ceci : prendre des données dans certaines cases → faire quelque chose avec → placer le résultat dans d’autres cases.
En combinant des centaines d’instructions simples, on obtient des opérations complexes et utiles.
Lorsqu’une variable est déclarée dans le code du programme, un petit bloc de mémoire encore libre lui est alloué. C’est généralement quelques octets. Lors de la déclaration d’une variable, il faut impérativement indiquer le type d’information que le programme y stockera : nombres, texte ou autres données. Sans connaître le type de l’information, il est impossible de savoir quelle taille de bloc mémoire allouer pour la variable.
Aux débuts de l’informatique, les programmes travaillaient directement avec les numéros des cases mémoire, puis, pour le confort des programmeurs, on a commencé à donner des noms aux cases. Le nom unique d’une variable sert avant tout au confort des programmeurs : pendant l’exécution, le programme se débrouillerait très bien avec de simples numéros.
2. Variables en mémoire
En Java, il existe 4 types principaux pour stocker des nombres entiers. Ce sont byte, short, int et long.
| Type | Taille, octet | Origine du nom |
|---|---|---|
|
|
Byte, car occupe un octet de mémoire |
|
|
Abréviation de Short Integer |
|
|
Abréviation de Integer |
|
|
Abréviation de Long Integer |
Java propose aussi 2 types à virgule flottante — float et double :
| Type | Taille, octet | Origine du nom |
|---|---|---|
|
|
Abréviation de Floating Point Number |
|
|
Abréviation de Double Float |
Chaque fois que l’exécution atteint une instruction de création de variable, une petite zone de mémoire lui est allouée (sa taille dépend du type de la variable).
L’adresse d’une variable est l’adresse de la première case du bloc de mémoire qui lui est alloué.
Les programmes Java n’ont pas le droit d’accéder directement à la mémoire. Toute manipulation de la mémoire s’effectue uniquement via la machine virtuelle Java.
3. Le type String en mémoire
Le type String peut contenir de grands volumes de données ; ce n’est donc pas qu’un simple type de données, mais un véritable objet.
Les données elles‑mêmes de type String (le texte) sont placées dans un objet spécial pour lequel de la mémoire est allouée, et c’est l’adresse de cet objet qui est placée dans la variable, pour laquelle de la mémoire est également allouée.

- La variable a de type int occupe 4 octets et contient la valeur 1.
- La variable b de type int occupe 4 octets et contient la valeur 10,555. La virgule n’est pas la partie fractionnaire du nombre, c’est un séparateur de milliers. La partie fractionnaire est séparée par un point.
- La variable d de type double occupe 8 octets et contient la valeur 13.001.
- La variable str de type String contient la valeur D12 — l’adresse de la première case de l’objet qui contient le texte.
L’objet de type String (qui contient le texte) est stocké dans un bloc de mémoire séparé. L’adresse de sa première case est stockée dans la variable str.
4. Ce qui se passe lors d’une affectation
Autre point important — le fonctionnement de l’affectation. Par exemple :
int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10
Dans cet exemple, deux cases sont créées en mémoire : une pour a, une pour b. Quand on écrit b = a;, c’est la valeur (10) qui est copiée, pas la « boîte ». Les modifications de b n’affectent en rien a.
Maintenant, la même chose avec les chaînes :
String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"
Ici, les deux variables s1 et s2 référencent la même chaîne "Hello" jusqu’au moment de la modification. Mais lorsque nous exécutons s2 = s2 + " World";, une nouvelle chaîne "Hello World" est créée pour s2, tandis que s1 continue de pointer vers l’ancienne chaîne "Hello".
5. Pourquoi en programmation on numérote à partir de zéro
Beaucoup se demandent pourquoi, en programmation, on compte presque partout à partir de zéro. En réalité, il y a de très nombreuses situations où compter à partir de zéro est plus pratique (même s’il existe des situations où il est plus pratique de commencer à 1).
Prenons une analogie. Vous faites la queue dans un magasin. Le caissier annonce que tous les clients à partir du 20e doivent se diriger vers la deuxième caisse. Quels seront leurs numéros ? 20, 21, 22, 23, ... Logique. Relativement au 20e ? 0, 1, 2, 3, ...
Lorsqu’on définit un groupe comme « numéro du premier élément » + « quantité », alors, à l’intérieur du groupe, les numéros relatifs sont +0, +1, +2, ...
En programmation, c’est pareil. Si 100 octets de mémoire ont été alloués à votre variable et que vous avez X – l’adresse du premier octet, quelles seront les adresses de tous les octets ? X+0, X+1, X+2, ..., X+99. Nous obtenons ainsi un groupe d’octets avec des indices 0, 1, 2, 99.
Dès que l’on raisonne en termes d’adresse relative à l’intérieur d’un bloc de données, on obtient une numérotation à partir de zéro. C’est la première et la plus répandue des raisons de compter depuis zéro.
GO TO FULL VERSION