Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #11

Les casts ont-ils un coût en Java ?

Réponse : Un cast sert à effectuer une conversion. Or Java permet de faire de multiples conversions avec la même syntaxe de cast.

Pour pouvoir répondre à la question posée, il faut donc commencer par distinguer les différents types de conversion par cast. D'après la spécification du langage Java, voici leur liste :

  • les conversions par identité : on convertit un type en le même type ;
  • les conversions par élargissement : on convertit un type vers un type plus large. Elles s'appliquent :
    • soit sur des types élémentaires numériques : par exemple int vers long ou float, byte vers short ou double, float vers double (noter qu'on peut malgré tout avoir une perte de précision lors de la conversion, avec int ou long vers float ou long vers double) ;
    • soit sur des références : conversion vers un super-type, plus général (appelée upcast en anglais : on remonte dans l'arborescence des types) ;
  • les conversions par resserrement : on convertit un type vers un type moins large. Elles s'appliquent :
    • soit sur des types élémentaires numériques : par exemple, int vers short, float vers int, double vers float ;
    • soit sur des références : conversion vers un sous-type plus spécifique (appelée downcast en anglais : on descend dans l'arborescence des types) ;
  • les conversions par boxing, sur les types élémentaires ;
  • les conversions par unboxing, sur les classes wrapper des types élémentaires.

Quel est le coût de chacune d'entre elles à l'exécution ?

  • les conversions par identité : aucun ;
  • les conversions par élargissement ou rétrécissement sur les types élémentaires numériques : le coût d'une, voire parfois 2 conversions numériques (dans le cas des conversions float ou double vers short, byte ou char, qui se font avec une conversion intermédiaire en int) ;
  • les conversions par élargissement ou rétrécissement sur des références : à première vue, le coût semble nul, sauf que... si la conversion est impossible, elle doit lever ClassCastException, ce qui impose à la JVM de faire un instanceof (qui, lui, a un coût) ;
  • les conversions par boxing : généralement la création d'un nouvel objet en mémoire, sauf dans certains cas parmi les plus fréquents (cf. Boolean.valueOf(boolean) ou Integer.valueOf(int), qui peuvent renvoyer un objet existant et stocké en cache plutôt que de créer un nouvel objet) ;
  • les conversions par unboxing : un appel de méthode (Integer.intValue(), Double.doubleValue(), Boolean.booleanValue(), ...).

Conclusion : à part la conversion par identité, qui n'a aucun effet (et qu'on écrit pour ainsi dire jamais), une conversion par cast a toujours un coût à l'exécution en Java !


Commentaires

1. Le vendredi 30 mai 2008, 14:12 par Brice

A noter que seul les Wrapper Integer, Long et Byte utilisent un cache et que celui-ci se limite aux valeurs dans l'intervalle -128;127.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.