2009-10-15 17 views
5

Ich frage mich nur, ob diese und andere verwandte Funktionen wie diese Integer eines dieser Dinge sind, mit denen man nicht belästigt werden sollte und gehen Sie einfach mit Long a = 1L; einfach und unkompliziert.Gibt es einen Unterschied zwischen Long a = Long.valueOf (1) oder Long a = 1L?

+0

Diese Frage wurde inspiriert von: http://stackoverflow.com/questions/130965/what-is-the-worst-code-youve-ever-written/1213190#1213190? – outis

+0

Nö hat diese Frage nie zuvor gesehen –

Antwort

10

Sie sind im Wesentlichen die gleichen, der Compiler intern erstellt einen Aufruf von Long.valueOf(), wenn es ein primitives Long in ein Long konvertieren muss, wird dies "Boxen" genannt.

In normalen Code sollten Sie den primitiven Typ lang verwenden, es ist effizienter als Long. Sie benötigen Long nur dann, wenn Sie Objekte benötigen, beispielsweise um lange Werte in Sammlungen zu setzen.

7

Mal sehen, was unter den Abdeckungen passiert. Betrachten Sie zunächst Folgendes:

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

Kompilieren Sie dies mit javac Example.java. Dann zerlegen Sie es mit javap -c Example. Das Ergebnis ist die folgende:

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, ändern nun das Programm auf die folgenden:

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

Compile und zerlegen Sie es erneut.

Sie werden sehen, dass diese Version des Programms genau so kompiliert wie die erste Version; Der Compiler hat den Aufruf an Long.valueOf(...) automatisch generiert.

Siehe: Autoboxing

Verwandte Themen