当前位置: 首页 > 面试题库 >

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

唐宇定
2023-03-14
问题内容

将其放入代码中-哪个具有更好的性能(如果有区别的话)?

鉴于这种:

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

问题答案:

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

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行(显式)相同。



 类似资料:
  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 问题内容: 从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理: Boxing 尝试不同的情况下后(),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,发现它仅实现一个带参数的构造函数。 因此,我的结论是,自动装箱的概念基于

  • 我的问题是在遵循图片中的函数、应用程序和单子教程及其JavaScript版本时提出的。 当文本说functor从上下文中展开值时,我理解a- 我的问题是,整件拆开包装的事情有什么神奇之处?我的意思是,有一些自动打开“范围”变量的语言规则有什么问题?在我看来,这个操作只是某种表中的一个查找,其中符号对应于整数。 我的问题受到JavaScript版本的启发,其中是原型数组实例。所以展开确实不是火箭科学

  • 问题内容: 我有一个扩展LinkedList类的类。这是一段代码摘录: 预期会返回自动拆箱的int值。但是由于某种原因,编译器会抛出一个错误,指出类型不兼容,所需的类型为int,找到的类型为Integer。这可以在不同的类中很好地工作!是什么赋予了?:( 问题答案: 这是因为你有追求。 通常,您使用类型参数:,但是使用了。也就是说,您创建了一个类型参数(阴影)。 就目前而言,您的课程相当于 删除t

  • 请帮我想想为什么这行不通。(这不是一个实际问题,而是OCPJP考试的心理练习。) //编译器错误:类型不兼容;必需:短,找到:整数 我假设编译器尝试在没有(或之前)拆箱的情况下先进行强制转换,而例如算术操作(iBoxediBoxedi)将首先拆箱。因此,是否可以说自动装箱/取消装箱在操作顺序(一元、算术、关系、逻辑、条件、分配)中占有一席之地,它到底在哪里? 我在下面的源代码中读到了有关强制转换的

  • 本文向大家介绍浅析C# 装箱和拆箱,包括了浅析C# 装箱和拆箱的使用技巧和注意事项,需要的朋友参考一下 Object类型是所有类型的基类,其下面有ValueType类型。什么结构啊,枚举啊,都继承ValueType,这些都是值类型。其他的什么类啊,数组啊,字符串啊等等都是引用类型。 简单的说,直接继承Object的都是引用类型,继承ValueType的都是值类型。 那样的话,像整形这样的结构按理说