2013-07-07 134 views
1

是不是很昂貴,它更好地避免它? 從this Java教程:拆箱是否昂貴?

public class ValueOfDemo { 
    public static void main(String[] args) { 

     // this program requires two 
     // arguments on the command line 
     if (args.length == 2) { 
      // convert strings to numbers 
      float a = (Float.valueOf(args[0])).floatValue(); 
      float b = (Float.valueOf(args[1])).floatValue(); 

爲什麼他們不只是把它像float a = (Float.valueOf(args[0]));?如果他們爲了節省時間給程序員引入鑽石操作員,他們爲什麼不利用拆箱功能?像他們一樣手動進行手動操作是否便宜?

在此先感謝。

+1

參見:[爲什麼人們仍然使用原語在Java中?(http://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in- JAVA) – jason

回答

3

實際上以下兩個Java應用程序產生相同的二進制代碼(使用JDK 7 U25 x64)的:

ValueOfDemo.java

public class ValueOfDemo 
{ 
    public static void main(String[] args) 
    { 
     float a = Float.valueOf("1.5").floatValue(); 
    } 
} 

編譯:

javac ValueOfDemo.java 

拆卸:

javap -c -cp . ValueOfDemo 
public class ValueOfDemo { 
    public ValueOfDemo(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String 1.5 
     2: invokestatic #3     // Method java/lang/Float.valueOf:(Ljava/lang/String;)Ljava/lang/Float; 
     5: invokevirtual #4     // Method java/lang/Float.floatValue:()F 
     8: fstore_1 
     9: return 
} 

ValueOfDemo2.java

public class ValueOfDemo2 
{ 
    public static void main(String[] args) 
    { 
     float a = Float.valueOf("1.5"); 
    } 
} 

編譯:

javac ValueOfDemo2.java 

拆卸:

javap -c -cp . ValueOfDemo2 
public class ValueOfDemo2 { 
    public ValueOfDemo2(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: ldc   #2     // String 1.5 
     2: invokestatic #3     // Method java/lang/Float.valueOf:(Ljava/lang/String;)Ljava/lang/Float; 
     5: invokevirtual #4     // Method java/lang/Float.floatValue:()F 
     8: fstore_1 
     9: return 
} 
0

拆箱便宜;你的建議被編譯到你在教程中看到的代碼中。本教程的重點是展示如何使用floatValue,以免顯示它可能會令人困惑。

不便宜的是,首先創建一個Float對象來解析一個字符串。改用Float.parseFloat。

float f = Float.parseFloat(string); 
0

拆箱並不昂貴,因爲它只是做你在Java 5之前的環境中做的事。只是它現在正在自動完成。

但是,像其他任何東西一樣,如果不必要地調用它就很昂貴。就像你的情況一樣,你應該直接使用parseFloat()而不是在兩者之間創建一個包裝。

在其他時候,拆箱非常透明,您無法意識到其妨礙性能。例如,如果你錯過了注意到你在循環中使用了一個包裝器類型作爲計數器,那麼在每次迭代時都會不必要地拆箱,遞增和裝箱。