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

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

鉴于这种:

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); } } 

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

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

这编译为:

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."":()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(显式)相同。

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

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

人类编写的技术有可能不那么优化,因此如果您使用人工书写的自动装箱方法,那么它可能会受到性能影响。 但是,如果你真的想要达到这个目标,那么人类可能会写出某种非常规解决方案,这种解决方案胜过默认性能。 这样的解决方案不会那么灵活,它可能会牺牲内存的计算复杂性(就像一个大的查找数组)。

就个人而言,我建议花一些时间来真正看到更大的图片。 优化一行或两行代码几乎不是一项好的投资。 减少整个计划所需的工作量更有可能提升您的绩效。

请注意,在一般情况下,JVM并没有随着自动装箱的引入而改变,只是编译器做了。 因此,编译器添加的指令与在最常见情况下手动写出的指令相同。 性能是在运行时在JVM中测量的,如果它是相同的字节码,则没有理由期望性能差异。

这只是过早的优化,但如果你认为你可以找到时间上的差异:仔细测试,然后意识到在不同的点发布,操作系统等可能会有所不同。这不是一个明确的胜利任何状况之下。

是一个VIP所以VI它必须返回Boolean而不是boolean