Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Örjan Petersson wrote:
Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
Örjan Petersson wrote:
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
Marc Petit-Huguenin writes:Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Marc Petit-Huguenin writes:Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type
erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Ton exemple ne correspond pas du tout a la discussion. Je parle
d'optimisation dans l'utilisation de l'auto(un)boxing avec les
Collections, pas avec une classe generique quelconque. Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Hotspot a alors *toutes* les informations necessaires, et c'est le sujet
de ce thread, pour transformer le "Object[] elementData" en un "int[]
elementData". Ca n'a rien a voir avec le fait que le type est erase a la
compilation. Les anciennes JVMs utiliseront Object[] elementData, mais
une JVM recente pourra faire cette modification lors de la compilation
Hotspot (et elle en fait bien d'autres, et bien plus tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Örjan Petersson wrote:
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
Örjan Petersson wrote:
Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type
erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Ton exemple ne correspond pas du tout a la discussion. Je parle
d'optimisation dans l'utilisation de l'auto(un)boxing avec les
Collections, pas avec une classe generique quelconque. Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Hotspot a alors *toutes* les informations necessaires, et c'est le sujet
de ce thread, pour transformer le "Object[] elementData" en un "int[]
elementData". Ca n'a rien a voir avec le fait que le type est erase a la
compilation. Les anciennes JVMs utiliseront Object[] elementData, mais
une JVM recente pourra faire cette modification lors de la compilation
Hotspot (et elle en fait bien d'autres, et bien plus tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Marc Petit-Huguenin writes:Örjan Petersson wrote:Le but de "autoboxing/autounboxing" n'est pas de complètement faire
disparaître la différence entre les types primitifs (int, short, ...)
et les références correspondants (Integer, Short, ...), et Hotspot ne
peut pas faire disparaître cette différence.
Je ne suis pas d'accord. Pourquoi est-ce que Hotspot ne pourrait pas
transformer un Integer[] en int[] dans le code natif genere?
Parce que pour HotSpot, notre ArrayList<Integer> est en fait une
ArrayList<Object>, et c'est pareil pour les autres collections.
(La généricité est implémentée comme ça. Sans rentrer dans les details,
l'information de la type d'une class générique est "gommé" (type
erasure
en anglais) pendant la compilation et n'existe pas au niveau du JVM)
Vrai, mais incomplet. Le classfile contient un nouvel attribut nomme
"Signature" qui contient la signature complete d'une class, method ou
d'un field. Ca permet d'etre compatible avec les anciennes JVM et de
quand meme permettre a la JVM de faire les optimisations qui
s'imposent.
L'attribut "Signature" ne change rien, il permet de retrouver les
"formal type parameters" utilisés pour la déclaration d'une classe (ou
interface, méthode, ...) mais ne donne rien concernant les "type
arguments" effectivement utilisés. Autrement dit, pour une classe
générique
public class C<E> {
E e;
E get() {return e;}
void set(E v) {e = v;}
}
utilisée dans
public class X {
C<Integer> ci = new C<Integer>();
C<String> cs = new C<String>();
...
}
nous avons les signatures (dans C.class)
C - "<T:Ljava/lang/Object;>Ljava/lang/Object;"
t - "TE"
get - "()TE;"
set - "(TE;)V"
et les descripteurs (aussi dans C.class)
set - "(Ljava/lang/Object;)V"
get - "()Ljava/lang/Object;"
L'utilisation de C par X pour stocker un Integer ou un String ne
change pas le fichier C.class. A cause de l'effacement de types (type
erasure) la classe C travaille toujours avec le type java/lang/Object
au niveau bytecode.
Ton exemple ne correspond pas du tout a la discussion. Je parle
d'optimisation dans l'utilisation de l'auto(un)boxing avec les
Collections, pas avec une classe generique quelconque. Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Hotspot a alors *toutes* les informations necessaires, et c'est le sujet
de ce thread, pour transformer le "Object[] elementData" en un "int[]
elementData". Ca n'a rien a voir avec le fait que le type est erase a la
compilation. Les anciennes JVMs utiliseront Object[] elementData, mais
une JVM recente pourra faire cette modification lors de la compilation
Hotspot (et elle en fait bien d'autres, et bien plus tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Hotspot a alors *toutes* les informations necessaires, et c'est le
sujet de ce thread, pour transformer le "Object[] elementData" en un
"int[] elementData". Ca n'a rien a voir avec le fait que le type est
erase a la compilation. Les anciennes JVMs utiliseront Object[]
elementData, mais une JVM recente pourra faire cette modification lors
de la compilation Hotspot (et elle en fait bien d'autres, et bien plus
tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
A part le fait qu'un Integer peut être null. Et pas un int.
Que doit il faire alors dans ces cas-là ?
Car rien n'interdit de faire le code suivant:
List<Integer> ci = new ArrayList<Integer>();
ci.add(0,new Integer(5));
ci.add(1,5);
ci.add(2,new Integer());
Integer j = ci.get(1);
int i = ci.get(2); ::<-- Null Pointer Exception
Le compilateur ne peut vraiment pas deviner à l'avance que lorsque tu
utilises des ArrrayList<Integer>, tu ne vas JAMAIS utiliser que des int
et pas des Integer.
Hotspot a alors *toutes* les informations necessaires, et c'est le
sujet de ce thread, pour transformer le "Object[] elementData" en un
"int[] elementData". Ca n'a rien a voir avec le fait que le type est
erase a la compilation. Les anciennes JVMs utiliseront Object[]
elementData, mais une JVM recente pourra faire cette modification lors
de la compilation Hotspot (et elle en fait bien d'autres, et bien plus
tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
A part le fait qu'un Integer peut être null. Et pas un int.
Que doit il faire alors dans ces cas-là ?
Car rien n'interdit de faire le code suivant:
List<Integer> ci = new ArrayList<Integer>();
ci.add(0,new Integer(5));
ci.add(1,5);
ci.add(2,new Integer());
Integer j = ci.get(1);
int i = ci.get(2); ::<-- Null Pointer Exception
Le compilateur ne peut vraiment pas deviner à l'avance que lorsque tu
utilises des ArrrayList<Integer>, tu ne vas JAMAIS utiliser que des int
et pas des Integer.
Hotspot a alors *toutes* les informations necessaires, et c'est le
sujet de ce thread, pour transformer le "Object[] elementData" en un
"int[] elementData". Ca n'a rien a voir avec le fait que le type est
erase a la compilation. Les anciennes JVMs utiliseront Object[]
elementData, mais une JVM recente pourra faire cette modification lors
de la compilation Hotspot (et elle en fait bien d'autres, et bien plus
tordu que ca).
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
A part le fait qu'un Integer peut être null. Et pas un int.
Que doit il faire alors dans ces cas-là ?
Car rien n'interdit de faire le code suivant:
List<Integer> ci = new ArrayList<Integer>();
ci.add(0,new Integer(5));
ci.add(1,5);
ci.add(2,new Integer());
Integer j = ci.get(1);
int i = ci.get(2); ::<-- Null Pointer Exception
Le compilateur ne peut vraiment pas deviner à l'avance que lorsque tu
utilises des ArrrayList<Integer>, tu ne vas JAMAIS utiliser que des int
et pas des Integer.
IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
... Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
... Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
... Si on a:
public class X {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
alors la signature contient bien "Ljava/util/List<Ljava/lang/Integer;>;"
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Le 2/4/2004 Marc Petit-Huguenin writes:IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
Un simple test indique que ce n'est pas le cas:
Je te laisse faire le bug report chez Sun :-)
Et si on a
public class X {
public void f() {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
}
il n'y a pas d'attribut Signature pour ci et cs. Il y a bien l'attribut
LocalVariableTypeTable mais il est purement optionnel et n'est pas présent
par defaut (uniquement avec javac -g pour debug info).
De plus, comment veux tu traiter les cas suivants:
void f1() {
ArrayList<Integer> l1 = new ArrayList<Integer>();
l1.add(287);
List l2 = (List) l1.clone(); // clone is shallow
Integer i1 = l1.get(0);
Integer i2 = (Integer)l2.get(0);
assert(i1 == i2);
}
void f2() {
List<Integer> li = new ArrayList<Integer>();
Integer i = 365;
li.add(0, i);
Integer j = li.get(0);
assert (i == j);
}
void f3() {
List<Integer> li = new ArrayList<Integer>();
List ll = li; // warning
ll.add(new Object());
}
[...]Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Je préfère de performances correctes aujourd'hui que d'être obligé
d'attendre une optimisation hypothétique de HotSpot...
A part de just penser que HotSpot peut le faire, as-tu quelque chose
un peu plus tangible pour affirmer que HotSpot fait/fera cet optimisation?
Le 2/4/2004 Marc Petit-Huguenin <marc@petit-huguenin.org> writes:
IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
Un simple test indique que ce n'est pas le cas:
Je te laisse faire le bug report chez Sun :-)
Et si on a
public class X {
public void f() {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
}
il n'y a pas d'attribut Signature pour ci et cs. Il y a bien l'attribut
LocalVariableTypeTable mais il est purement optionnel et n'est pas présent
par defaut (uniquement avec javac -g pour debug info).
De plus, comment veux tu traiter les cas suivants:
void f1() {
ArrayList<Integer> l1 = new ArrayList<Integer>();
l1.add(287);
List l2 = (List) l1.clone(); // clone is shallow
Integer i1 = l1.get(0);
Integer i2 = (Integer)l2.get(0);
assert(i1 == i2);
}
void f2() {
List<Integer> li = new ArrayList<Integer>();
Integer i = 365;
li.add(0, i);
Integer j = li.get(0);
assert (i == j);
}
void f3() {
List<Integer> li = new ArrayList<Integer>();
List ll = li; // warning
ll.add(new Object());
}
[...]
Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Je préfère de performances correctes aujourd'hui que d'être obligé
d'attendre une optimisation hypothétique de HotSpot...
A part de just penser que HotSpot peut le faire, as-tu quelque chose
un peu plus tangible pour affirmer que HotSpot fait/fera cet optimisation?
Le 2/4/2004 Marc Petit-Huguenin writes:IMO: Hotspot peut (va?) optimiser les collections de primitives
auto-boxed, donc pourquoi se faire du soucis? Au pire quelqu'un fera
les mesures qui s'imposent et creera un bug chez Sun.
Un simple test indique que ce n'est pas le cas:
Je te laisse faire le bug report chez Sun :-)
Et si on a
public class X {
public void f() {
List<Integer> ci = new ArrayList<Integer>();
List<String> cs = new ArrayList<String>();
...
}
}
il n'y a pas d'attribut Signature pour ci et cs. Il y a bien l'attribut
LocalVariableTypeTable mais il est purement optionnel et n'est pas présent
par defaut (uniquement avec javac -g pour debug info).
De plus, comment veux tu traiter les cas suivants:
void f1() {
ArrayList<Integer> l1 = new ArrayList<Integer>();
l1.add(287);
List l2 = (List) l1.clone(); // clone is shallow
Integer i1 = l1.get(0);
Integer i2 = (Integer)l2.get(0);
assert(i1 == i2);
}
void f2() {
List<Integer> li = new ArrayList<Integer>();
Integer i = 365;
li.add(0, i);
Integer j = li.get(0);
assert (i == j);
}
void f3() {
List<Integer> li = new ArrayList<Integer>();
List ll = li; // warning
ll.add(new Object());
}
[...]Le fond du probleme reste que donner comme conseil de ne pas utiliser
l'auto(un)boxing avec les Collections pour des raisons de performance
est stupide, et tient plus du Voodoo que d'un raisonnement logique.
Je préfère de performances correctes aujourd'hui que d'être obligé
d'attendre une optimisation hypothétique de HotSpot...
A part de just penser que HotSpot peut le faire, as-tu quelque chose
un peu plus tangible pour affirmer que HotSpot fait/fera cet optimisation?