2009-10-15 14 views
5

Basta chiedersi se questa e altre funzioni correlate come quelle di Integer sono una di quelle cose a cui non ci si deve preoccupare e basta andare con Long a = 1L; semplice e diretto.C'è qualche differenza tra Long a = Long.valueOf (1) o Long a = 1L?

+0

stata questa domanda ispirata da: http://stackoverflow.com/questions/130965/what-is-the-worst-code-youve-ever-written/1213190#1213190? – outis

+0

Nope non ha mai visto prima quella domanda –

risposta

10

Sono essenzialmente gli stessi, il compilatore crea internamente una chiamata a Long.valueOf() quando deve convertire una primitiva lunga in una lunga, questo è chiamato "boxing".

Nel codice normale è necessario utilizzare il tipo primitivo a lungo, è più efficiente di Long. Hai bisogno di Long solo quando hai bisogno di oggetti, ad esempio per inserire valori lunghi in raccolte.

7

Vediamo cosa succede sotto le coperte. In primo luogo, considerare questo:

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

compilare questo con javac Example.java. Quindi smontarlo con javap -c Example. Il risultato è il seguente:

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, ora cambiare il programma al seguente:

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

Compilare e smontare di nuovo.

Vedrete che questa versione del programma si compila esattamente come la prima versione; il compilatore ha generato automaticamente la chiamata a Long.valueOf(...).

Vedi: Autoboxing