1

拆箱是否昂贵,最好避免它?从这个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]));?如果他们为了节省程序员的时间而引入了菱形运算符,为什么不使用拆箱功能呢?像他们那样手动操作会更便宜吗?

提前致谢。

4

3 回答 3

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
}
于 2013-07-07T10:16:56.703 回答
0

从某种意义上说,拆箱并不昂贵,因为它只是在做您在 Java 5 之前的环境中自己会做的事情。只是它现在是自动完成的。

但是,像其他任何事情一样,如果不必要地调用它会很昂贵。就像您的情况一样,您应该parseFloat()直接使用而不是在两者之间创建包装器。

在其他时候,拆箱是如此透明,以至于您无法意识到其妨碍性能。例如,如果您没有注意到您在循环中使用了包装器类型作为计数器,那么在每次迭代中都将不必要地拆箱、递增和装箱。

于 2013-07-07T10:13:17.807 回答
0

拆箱便宜;您的建议将被编译成您在本教程中看到的代码。本教程的重点是展示如何使用 floatValue,因此不展示它可能会造成混淆。

不那么便宜的是首先创建一个 Float 对象只是为了解析一个字符串。请改用 Float.parseFloat。

float f = Float.parseFloat(string);
于 2013-07-07T10:05:21.623 回答