把它放在代码中 - 性能更好(如果有差异的话)?
鉴于此:
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);
}
}
答案 0 :(得分:12)
它们之间没有区别,您可以在字节码中验证它:
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(显式)相同。
答案 1 :(得分:8)
差异应该都在编译时,因为自动拆箱只是语法糖。在这种情况下,生成的Java字节码应该完全相同。这意味着在运行时没有区别。但是,在更一般的情况下,显式拆箱可能会更快,因为隐式拆箱可能会多次取消打包值,而使用显式取消装箱,您可以保证该值仅取消装箱一次并存储结果。
答案 2 :(得分:3)
性能方面,理想情况下应该是相同的。
人类编写的技术有可能不那么优化,因此如果您使用人工书写的自动装箱方法,可能会受到性能影响。但是,如果你真的想要达到这个目标,那么人类可能会写出某种非常规解决方案,这种解决方案胜过默认性能。这样的解决方案不会那么灵活,它可能会牺牲内存的计算复杂性(就像一个大的查找数组)。
就个人而言,我建议花一些时间来真正查看更大的图片。优化一行或两行代码几乎不是一项好的投资。减少整个计划所需的工作量更有可能提高你的绩效。
请注意,在一般情况下,JVM并没有随着自动装箱的引入而改变,只是编译器做了。因此编译器会添加与在最常见情况下手动写出的相同的指令。性能是在运行时在JVM中测量的,如果它是相同的字节码,则没有理由期望性能差异。
这只是过早的优化,但如果你认为你可以找到时间上的差异:仔细测试,然后意识到它可能在不同的点发布,操作系统等可能是不同的。它只是不是一个无论如何都能获胜。
答案 3 :(得分:0)
VIP是VI,它必须返回Boolean
而不是boolean
吗?