J'ai une petite question récurrente qu'on me pose souvent et que
j'aimerai transmettre au "bytecodeurs" ici présents (ou du moins aux
connaisseurs de la JVM) :
Les deux lignes suivantes compilent, mais ont-elles le même résultat au
niveau du bytecode ? (autrement dit, sont-elles strictement identiques
ou l'une vaut-elle mieux que l'autre ?) :
1: List<Double> l1 = new ArrayList();
2: List<Double> l2 = new ArrayList<Double>();
(ce sont bien sûr des java.util.List)
Lorsque l'on fait "Double d1 = l1.get(0)", un cast implicite d'Object
vers Double est-il fait ?
Merci pour votre temps-neurone passé sur cette question !
Comme tu peux le voir l1() et l2() ont exactement le même bytecode.
Lorsque l'on fait "Double d1 = l1.get(0)", un cast implicite d'Object vers Double est-il fait ?
Oui tout à fait. Regarde les lignes 25 de l1() et l2().
Par la suite l'optimiseur du jit peut virer le test du cast s'il prouve que le type est toujours le même type que celui attendu.
a+
sam.
Javajug
Le 10/04/2015 20:30, Samuel DEVULDER a écrit :
Comme tu peux le voir l1() et l2() ont exactement le même bytecode.
Lorsque l'on fait "Double d1 = l1.get(0)", un cast implicite d'Object vers Double est-il fait ?
Oui tout à fait. Regarde les lignes 25 de l1() et l2().
Super, et un grand merci (un peu tardif dsl) pour ta réponse. C'est bon à savoir quand on commence à se retrouver avec des types paramétrés un peu compliqués...
Tu m'as donné envie d'utiliser 'javap -c' plus souvent (en attendant une vraie formation JVM) ! Je verrai plus tard pour les détails de l'optimisation JIT dans Java...
Le 10/04/2015 20:30, Samuel DEVULDER a écrit :
Comme tu peux le voir l1() et l2() ont exactement le même bytecode.
Lorsque l'on fait "Double d1 = l1.get(0)", un cast implicite d'Object
vers Double est-il fait ?
Oui tout à fait. Regarde les lignes 25 de l1() et l2().
Super, et un grand merci (un peu tardif dsl) pour ta réponse. C'est bon
à savoir quand on commence à se retrouver avec des types paramétrés un
peu compliqués...
Tu m'as donné envie d'utiliser 'javap -c' plus souvent (en attendant une
vraie formation JVM) !
Je verrai plus tard pour les détails de l'optimisation JIT dans Java...
Comme tu peux le voir l1() et l2() ont exactement le même bytecode.
Lorsque l'on fait "Double d1 = l1.get(0)", un cast implicite d'Object vers Double est-il fait ?
Oui tout à fait. Regarde les lignes 25 de l1() et l2().
Super, et un grand merci (un peu tardif dsl) pour ta réponse. C'est bon à savoir quand on commence à se retrouver avec des types paramétrés un peu compliqués...
Tu m'as donné envie d'utiliser 'javap -c' plus souvent (en attendant une vraie formation JVM) ! Je verrai plus tard pour les détails de l'optimisation JIT dans Java...