在性能,隐式(自动)拆箱或显式拆箱方面哪个更好?

Ron*_*onK 1 java performance unboxing

把它放在代码中 - 性能更好(如果有差异的话)?

鉴于这种:

public class Customer
{
    ....

    public Boolean isVIP(){...}
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪个更快?

public void handleCustomer(Customer customer)
{
    if (customer.isVIP())  // Auto Unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}
Run Code Online (Sandbox Code Playgroud)

或这个:

public void handleCustomer(Customer customer)
{
    if (customer.isVIP().booleanValue()) // Explicit unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*k D 14

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

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

运行javap以查看它编译的内容:

javap -c ImplicitTest
Run Code Online (Sandbox Code Playgroud)

这是输出:

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

}
Run Code Online (Sandbox Code Playgroud)

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


dsi*_*cha 8

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