Pourquoi utiliser des types primitifs dans java au lieu de classes Wrapper? Je veux savoir que nous avons déjà des classes wrapper en Java, alors pourquoi avons-nous besoin d'utiliser des types primitifs? Quelle est l'importance des types primitifs dans Java?Types de primitives en Java
Répondre
Votre question est à l'envers. Les types primitifs sont plus fondamentaux que leurs enveloppes. En réalité, la seule chose utile que les wrappers vous donnent est la possibilité d'être traité comme une sous-classe de Object (afin qu'ils puissent être mis dans des collections, etc.). Toutes les choses vraiment utiles (comme l'arithmétique et l'ordre) sont fournies par le type primitif.
Notez que si vous pouvez dire des choses comme:
Integer i = Integer.valueOf(4);
Integer j = Integer.valueOf(2);
Integer k = i + j;
c'est juste une commodité. En dessous, la dernière ligne devient quelque chose comme:
Integer k = Integer.valueOf(i.intValue() + j.intValue());
de sorte que l'arithmétique se produise sur les valeurs primitives. (Cette pratique est connue sous le nom de boxe/unboxing.) Il y a une pénalité de performance à cela, de sorte que sur ma machine, cette boucle:
for (int i=0; i<10000000; i++) { }
est environ 10 fois plus rapide que cette boucle:
for (Integer i=0; i<10000000; i++) { }
performances, les classes primitives sont mappées au processeur sans avoir à passer par autant d'opérations.
Dans le cas de booléen, int et float - vous pouvez les rendre volatils et veiller à ce qu'ils ne nécessitent pas de synchronisation (lectures et écritures sont atomiques)
En Java, chaque objet a une surcharge de l'espace. Cela dépend de la JVM, et de la taille d'un "mot" sur l'architecture cible (64 bits contre 32 bits), mais j'estime généralement que chaque objet a environ 40 octets de "overhead" au-delà de ce qui est nécessaire pour ses champs . Ainsi, par exemple, un tableau de 1 024 octets est un objet, avec 40 octets de préfixe; il a un membre length
(un int
) qui a besoin de 4 octets, et il a besoin de 1 octet pour chaque élément, pour un total d'environ 1k.
Un tableau de 1024 Byte
cas, a la tête de la matrice elle-même, son élément length
, puis environ 41 octets pour chaque instance Byte
(40 octets de surcharge, en plus de 1 octet pour les données). Au total, c'est plus de 41k! Beaucoup plus qu'une primitive byte[]
. Puisque les types de wrapper sont immuables, il y a eu des suggestions d'astuces pour faire ressembler les données primitives à des instances d'objets enveloppées, mais jusqu'à présent, aucun de ces mécanismes n'a été implémenté.
[humour] Pour économiser la frappe! Ce:
int i = 4;
int j = 38;
int k = i + j;
est plus courte à taper que:
Integer i = new Integer(4);
Integer j = new Integer(38);
Integer k = i + j;
[/ humour]
En réalité, les autres réponses disent mieux que je pouvais.
@ matto1990: Vous n'avez pas compris le point de votre modification, car votre version ou la mienne fonctionnerait. En tant que tel, je préfère que mon poste soit laissé seul. Mais bon, merci de m'avoir aidé à obtenir le badge de nettoyage! – GreenMatt
Désolé aurait dû expliquer. Avec quelques entiers (ci-dessous 100), la classe Integer les pré-génère et les garde en mémoire. Par conséquent, si vous appelez Integer.valueOf (4), vous recevrez une classe déjà en mémoire. Appeler new Integer (4) va créer une nouvelle instance d'Integer et stocker cela en mémoire. Ce n'est qu'une toute petite chose et en pratique, cela n'a pas vraiment d'importance. Je l'ai juste vu et j'ai pensé que je le changerais. Jetez un oeil ici dans les documents Java: http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf(int) – matto1990
@ matto1990 : Merci pour l'explication, cela a déclenché un faible souvenir. Cependant, le code dans votre édition est plus long que le mien, donc cela prouve encore mieux le point! :-) – GreenMatt
La question est en fait valide d'une certaine façon - oui, en pratique, en Java les classes wrapper sont définies en termes de types primitifs, et ces derniers sont «magiques». Mais il pourrait aussi bien être que les classes elles-mêmes sont "magiques", et il n'y a pas du tout de primitives typées. –