Certaines des raisons ont déjà été évoquées. Par exemple, le fait que "... (Presque) Toutes les opérations sur octet, short promouvra ces primitives en int" . Cependant, la prochaine question évidente serait: POURQUOI ces types sont-ils promus int
?
Donc, pour aller un peu plus loin: la réponse peut simplement être liée au jeu d'instructions de la machine virtuelle Java. Comme résumé dans le tableau de la spécification de la machine virtuelle Java , toutes les opérations arithmétiques intégrales, telles que l'ajout, la division et autres, ne sont disponibles que pour le type int
et le type long
, et non pour les types plus petits.
(Un aparté: les types plus petits ( byte
et short
) sont essentiellement destinés uniquement aux tableaux . Un tableau comme new byte[1000]
prendra 1000 octets, et un tableau comme new int[1000]
prendra 4000 octets)
Maintenant, bien sûr, on pourrait dire que "... la prochaine question évidente serait: POURQUOI ces instructions sont-elles proposées uniquement pour int
(et long
)?" .
Une raison est mentionnée dans la spécification JVM mentionnée ci-dessus:
Si chaque instruction saisie prenait en charge tous les types de données d'exécution de la machine virtuelle Java, il y aurait plus d'instructions que ce qui pourrait être représenté dans un octet
De plus, la machine virtuelle Java peut être considérée comme une abstraction d'un processeur réel. Et l'introduction d'une unité logique arithmétique dédiée pour les types plus petits ne vaudrait pas la peine: elle aurait besoin de transistors supplémentaires, mais elle ne pourrait toujours exécuter qu'une seule addition en un cycle d'horloge. L'architecture dominante lors de la conception de la JVM était de 32 bits, juste pour un 32 bits int
. (Les opérations qui impliquent une long
valeur de 64 bits sont implémentées comme cas particulier).
(Remarque: le dernier paragraphe est un peu simplifié, considérant la vectorisation possible, etc., mais devrait donner une idée de base sans plonger trop profondément dans les sujets de conception de processeur)
EDIT: Un petit addendum, se concentrant sur l'exemple de la question, mais dans un sens plus général: On pourrait également se demander s'il ne serait pas avantageux de stocker des champs en utilisant les types plus petits. Par exemple, on pourrait penser que la mémoire pourrait être sauvegardée en stockant Calendar.DAY_OF_WEEK
sous forme de fichier byte
. Mais ici, le format de fichier de classe Java entre en jeu: tous les champs d'un fichier de classe occupent au moins un "emplacement", qui a la taille d'un int
(32 bits). (Les champs "larges", double
et long
, occupent deux emplacements). Donc, déclarer explicitement un champ comme short
ou byte
ne sauverait pas non plus de mémoire.