17
mai
2008
mai
2008
Java Quiz #11
Java / JEE ›
Java Quiz
|
Tags :
java
Par Olivier Descout
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
verslong
oufloat
,byte
versshort
oudouble
,float
versdouble
(noter qu'on peut malgré tout avoir une perte de précision lors de la conversion, avecint
oulong
versfloat
oulong
versdouble
) ; - 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) ;
- soit sur des types élémentaires numériques : par exemple
- 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
versshort
,float
versint
,double
versfloat
; - 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) ;
- soit sur des types élémentaires numériques : par exemple,
- 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
oudouble
versshort
,byte
ouchar
, qui se font avec une conversion intermédiaire enint
) ; - 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 uninstanceof
(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)
ouInteger.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
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.