1

把它放在代码中 - 哪个具有更好的性能(如果有区别的话)?

鉴于这种:

public class Customer
{
    ....

    public Boolean isVIP(){...}
    ...
}

哪个更快?

public void handleCustomer(Customer customer)
{
    if (customer.isVIP())  // Auto Unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}

或这个:

public void handleCustomer(Customer customer)
{
    if (customer.isVIP().booleanValue()) // Explicit unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}
4

4 回答 4

14

它们之间没有区别,您可以在字节码中进行验证:

public class ImplicitTest {
    public static void main(String[] args) {
        Boolean b = true; 
        boolean i = b;
        boolean e = b.booleanValue();
    }
}

运行javap看看它编译成什么:

javap -c ImplicitTest

这是输出:

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

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   invokestatic    #2; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
   4:   astore_1
   5:   aload_1
   6:   invokevirtual   #3; //Method java/lang/Boolean.booleanValue:()Z
   9:   istore_2
   10:  aload_1
   11:  invokevirtual   #3; //Method java/lang/Boolean.booleanValue:()Z
   14:  istore_3
   15:  return

}

如您所见 - 第 5、6、9 行(隐式)与第 10、11、14 行(显式)相同。

于 2011-08-02T17:48:56.360 回答
8

区别应该都在编译时,因为自动拆箱只是语法糖。在这种情况下,生成的 Java 字节码应该完全相同。这意味着在运行时没有区别。但是,在更一般的情况下,显式拆箱可能更快,因为隐式拆箱可能会多次拆箱该值,而使用显式拆箱可以保证该值仅拆箱一次并存储结果。

于 2011-08-02T17:17:06.023 回答
3

性能方面,理想情况下它们应该是相同的。

人工编写的技术有可能不太理想,因此如果您使用糟糕的人工编写的自动装箱方法,可能会影响性能。但是,如果你真的想得到它,那么人类可能会编写某种非通用解决方案来超越默认性能的机会是平等的。这样的解决方案不会那么灵活,并且可能会以内存计算复杂度为代价(如大查找数组)。

就个人而言,我建议花一些时间来真正查看更大的图景。优化一两行代码几乎不是一项好的投资。减少整个程序所需的工作量更有可能让你的表现得到提升。

请注意,在一般情况下,JVM 不会随着自动装箱的引入而改变,只是编译器会改变。因此,编译器添加的指令与您在最常见的情况下手动编写的指令相同。性能是在运行时在 JVM 中衡量的,如果无论哪种方式都是相同的字节码,则没有理由期待性能差异。

这有点过早优化的味道,但是如果您认为可以及时发现差异:请仔细测试,然后意识到在不同的版本、操作系统等上可能会有所不同。这并不是一个明确的胜利任何状况之下。

于 2011-08-02T17:20:40.060 回答
0

VIP 是否如此 VI 以至于它必须返回Boolean而不是返回boolean

于 2011-08-02T18:32:58.567 回答