2009-10-15 6 views
5

Je me demandais simplement si cela et d'autres fonctions connexes comme ces entiers sont l'une de ces choses que l'on ne devrait pas être dérangé avec et juste aller avec Long a = 1L; simple et direct.Y at-il une différence entre Long a = Long.valueOf (1) ou Long a = 1L?

+0

cette question était-inspirée par: http://stackoverflow.com/questions/130965/what-is-the-worst-code-youve-ever-written/1213190#1213190? – outis

+0

Nope n'a jamais vu cette question avant –

Répondre

10

Ils sont essentiellement les mêmes, le compilateur crée en interne un appel à Long.valueOf() lorsqu'il doit convertir une primitive longue en Long, c'est ce qu'on appelle "boxe".

En code normal, vous devez utiliser le type primitif long, il est plus efficace que Long. Vous n'avez besoin de Long que lorsque vous avez besoin d'objets, par exemple pour mettre des valeurs longues dans des collections.

7

Voyons ce qui se passe sous les couvertures. Tout d'abord, considérez ceci:

public class Example { 
    public static void main(String[] args) { 
     Long a = Long.valueOf(1L); 
     System.out.println(a); 
    } 
} 

avec ce Compile javac Example.java. Puis démonter avec javap -c Example. Le résultat est le suivant:

Compiled from "Example.java" 
public class Example extends java.lang.Object{ 
public Example(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: lconst_1 
    1: invokestatic #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
    4: astore_1 
    5: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 
    8: aload_1 
    9: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 
    12: return 

} 

Ok, modifiez maintenant le programme à ce qui suit:

public class Example { 
    public static void main(String[] args) { 
     Long a = 1L; 
     System.out.println(a); 
    } 
} 

Compile et démonter à nouveau.

Vous verrez que cette version du programme se compile exactement comme la première version; le compilateur a généré l'appel à Long.valueOf(...) automatiquement.

Voir: Autoboxing

Questions connexes