Deux familles : primitifs et références
Toute valeur en Java a un type, et ce type appartient à l'une des deux familles. Les types primitifs contiennent une valeur brute directement : un nombre, un seul caractère ou un vrai/faux. Les types référence contiennent une référence (un pointeur) vers un objet situé ailleurs en mémoire : String, les tableaux et toute classe que vous ou les bibliothèques définissez.
Cette distinction compte parce que les primitifs sont légers et copiés par valeur, tandis que les variables référence pointent vers des objets partagés. Commencez par les huit primitifs : ils sont le fondement sur lequel tout le reste repose.
Les huit types primitifs
Java compte exactement huit types primitifs intégrés. Six sont des nombres, un est un caractère, un est un booléen :
Quelques points à remarquer d'emblée : les tirets bas dans 2_000_000 ne sont que des séparateurs visuels ignorés par le compilateur, les suffixes L et f sont obligatoires (voir ci-dessous), et char utilise des apostrophes alors qu'une String utiliserait des guillemets.
Choisir un type numérique
Vous n'avez presque jamais besoin de byte ou short : ils n'économisent de la mémoire que dans d'énormes tableaux. Les vrais choix se font entre int/long pour les entiers et float/double pour les décimaux.
| Type | Taille | À utiliser quand |
|---|---|---|
int | 32 bits | La valeur par défaut pour les entiers (jusqu'à ~2,1 milliards) |
long | 64 bits | Valeurs au-delà de ~2 milliards : horodatages en millisecondes, tailles de fichiers |
double | 64 bits | La valeur par défaut pour les décimaux - bonne précision |
float | 32 bits | Uniquement quand la mémoire est limitée et que la précision peut en pâtir |
Le piège, c'est le dépassement. Un int boucle silencieusement lorsqu'il dépasse sa plage - aucune erreur, juste une réponse fausse :
maxInt + 1 déborde vers -2147483648 parce que les deux opérandes sont des int et que le résultat reste un int. Convertir un côté en long d'abord effectue le calcul sur 64 bits. Lorsqu'une valeur peut être grande - surtout des millisecondes depuis 1970 - tournez-vous vers long.
Les littéraux et leurs suffixes
Un littéral numérique nu a un type par défaut, et cela piège les gens. 100 est un int ; 3.14 est un double. Pour écrire un littéral long ou float, vous devez ajouter un suffixe :
Retirez le L de 8_000_000_000L et le code ne compilera pas, car le littéral dépasse la plage de int avant même d'atteindre la variable long. Retirez le f de 0.5f et Java se plaint qu'un double ne peut pas être assigné à un float sans conversion. Le suffixe est insensible à la casse, mais utilisez un L majuscule - un l minuscule ressemble exactement au chiffre 1.
char est un nombre déguisé
Un char stocke une unité de code Unicode sur 16 bits, ce qui signifie qu'il joue aussi le rôle d'un petit entier non signé. Vous pouvez faire de l'arithmétique dessus et le convertir dans les deux sens avec un cast :
C'est occasionnellement pratique pour décaler des lettres, mais ne comptez pas dessus pour le texte - c'est à ça que sert String. Notez que char utilise des apostrophes ('A') ; les guillemets ("A") créent une String d'un seul caractère, qui est un type complètement différent.
Valeurs par défaut (et le piège des variables locales)
Les champs et les éléments de tableau que vous n'initialisez pas reçoivent une valeur par défaut sensée. Mais cela ne s'applique qu'aux champs et aux cases de tableau : les variables locales ne reçoivent aucune valeur par défaut, et en utiliser une avant de lui assigner une valeur est une erreur de compilation, pas une surprise à l'exécution.
Si vous écriviez plutôt int x; System.out.println(x); dans main, le compilateur le rejetterait avec « variable x might not have been initialized ». Cette rigueur est un atout : elle vous empêche de lire des données parasites. Les valeurs par défaut à retenir : les types numériques 0, boolean false, char ' ' et tout type référence null.
Suite : Strings
String est le type référence que vous manipulerez le plus : texte, valeurs concaténées, saisie utilisateur. Il se comporte différemment des primitifs vus ici : c'est un objet, il est immuable, et comparer des chaînes a ses propres pièges. La page suivante le couvre.
Questions fréquentes
Combien y a-t-il de types de données en Java ?
Java possède huit types primitifs : byte, short, int, long, float, double, char et boolean. Tout le reste - String, les tableaux et tout objet - est un type référence. Le nombre de primitifs intégrés est donc fixé à huit, tandis que les types référence sont illimités, puisque vous (et les bibliothèques) définissez de nouvelles classes.
Quelle est la différence entre int et long en Java ?
Les deux stockent des nombres entiers, mais int est sur 32 bits (plage d'environ ±2,1 milliards) et long sur 64 bits (plage d'environ ±9,2 trillions). Utilisez int par défaut ; passez à long lorsqu'une valeur peut dépasser deux milliards : horodatages en millisecondes, tailles de fichiers, grands compteurs. Un littéral long nécessite le suffixe L, par exemple long big = 10000000000L;.
Quelle est la valeur par défaut d'un int en Java ?
Un champ de type int vaut par défaut 0 - mais seuls les champs et les éléments de tableau reçoivent des valeurs par défaut. Un long vaut 0L, un double 0.0, un boolean false, un char '\u0000' et tout type référence null. Les variables locales ne reçoivent aucune valeur par défaut : vous devez en assigner une avant utilisation, sinon le code ne compilera pas.