首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编译器为自动装箱生成了什么代码?

编译器在自动装箱过程中生成的代码主要是对象的创建和初始化。在Java中,自动装箱是指编译器在编译时自动将基本数据类型转换为相应的包装类对象。例如,将int类型转换为Integer对象。

编译器生成的代码会调用包装类的valueOf方法来创建一个新的包装类实例。例如,将int类型的值转换为Integer对象时,编译器生成的代码类似于以下形式:

代码语言:txt
复制
Integer i = Integer.valueOf(10);

这里,编译器生成的代码调用了Integer类的valueOf方法,该方法会返回一个表示该整数值的Integer对象。

需要注意的是,自动装箱并不是原始数据类型和包装类对象之间的等价转换,而是编译器提供的一种语法糖,方便程序员编写代码。在某些情况下,使用自动装箱可能会导致性能损失,因为编译器生成的代码可能会创建额外的对象。因此,在性能敏感的场景下,建议程序员手动进行装箱和拆箱操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式

前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的...本文不是从最底层的编译原理讲解 本文是针对java代码,去查看归纳总结编译器的结果行为,从而直观的感受到字节码指令集 也就是说本文的内容,主要针对的是使用javap 查看字节码文件中方法的code...加载常量2 到栈顶4,比较如果大于后者等于跳转到13 然后1号局部变量 自增1 然后下一步顺序到16 return否则就是顺序执行到7 1号局部变量 增量-1  自增运算 然后到10 ,10跳转到...3号局部变量 ,然后将常量 A C  hehe 也加载到栈然后调用equal方法进行比较 代码千千万,本文只是找一些基本的示例展示字节码与代码的对应关系,想要熟悉这块 唯有没事多javap看看你代码的...常量8 加载到栈4 保存到2号 局部变量5,加载1号局部变量6, 加载2号局部变量7 执行iadd 结果会压入栈顶8 栈顶元素保存到3号局部变量至此 完成了前三行代码后一部分:9.常量9 加载到栈

57520

5分钟彻底理解-Java自动装箱、拆箱

什么自动装箱,拆箱 先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让我们的代码更简洁易懂 Java中基础数据类型与它们对应的包装类见下表...Character float Float int Integer long Long short Short double Double 当表格中左边列出的基础类型与它们的包装类有如下几种情况时,编译器自动帮我们进行装箱或拆箱...Float包装类型,我们赋值给float基础类型,所以需要进行拆箱,很简单,安排的明明白白 具体自动装箱,拆箱,代码是如何实现的 既然编译器帮我们自动进行了装箱,拆箱,那么编译器到底做了些什么,要搞清楚这些...自动装箱、拆箱中的坑 面试题中经常会有考点就是考察面试者对Java中自动装箱、拆箱是否了解透彻,比如下面这一道面试题?...,这时会进行装箱,调用Integer的valueOf方法,生成2个Integer对象,引用类型==比较,直接比较对象指针,这里我们先给出结论,最后会分析原因,打印 true 跟上面第2段代码类似,只不过赋值变成了

1.1K20
  • Java自动拆箱空指针异常,救火队员上线

    下面就带大家分析一下Java中基础类型的包装类在拆箱和装箱过程中都做了什么,为什么会出现空指针异常,以及面试过程中会出现的相关面试题。 问题重现 下面通过一个简单的示例才重现一下异常出现的场景。...为了分析更简化,我们以第二个例进行讲解。 原因分析 最初大家可能会疑惑,抛出异常的代码都没有对象的方法调用,怎么会出现空指针呢? 这中间主要涉及到的就是一个自动拆箱操作。是否是拆箱导致的呢?...也就是说编译器将getValue(value)拆分成了两步,第一步将通过value的longValue方法将其拆箱,然后再将拆箱之后的结果传递给方法。...,将原始类型int,装箱成了Integer,调用的方法Integer.valueOf;而编号7进行了拆箱操作将Integer类型转换成了int类型,调用的方法Integer.intValue。...自动拆箱装箱的本质 通过上面的分析,我们可以看出所谓的拆箱(unboxing)和装箱(boxing)操作只不过是一个语法糖的功能。编译器在编译操作时,本质上还是会调用对应包装类的不同方法来进行处理。

    1.4K30

    滚雪球学Java(07):自动装箱自动拆箱,Java开发者必备技能

    下面是一个自动类型转换的例子:byte b = 10;int i = b; // 自动类型转换System.out.println(i);在上面的代码中,byte 类型的变量 b 被自动转换成了...对象 i,编译器自动将 int 类型的值装箱 Integer 对象。...对象 i 的值赋值给 int 类型的 j,编译器自动将 Integer 对象 i 拆箱基本类型的 int。...在代码中,第一行通过将 int 类型的 100 自动装箱成了 Integer 类型的 i,然后输出了 i 的值。...第四行将一个新建的 Integer 对象 j 自动拆箱成了 int 类型的 k,然后输出了 k 的值。  通过这两个例子,我们可以看到 Java 中的自动装箱自动拆箱可以让代码更加简洁易懂。

    11821

    如何理解Java中的自动拆箱和自动装箱

    如何理解Java中的自动拆箱和自动装箱自动拆箱?自动装箱什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢......1、 什么自动装箱自动拆箱 定义:基本数据类型和包装类之间可以自动地相互转换 理解:装箱就是自动将基本数据类型转换为封装类型,拆箱就是自动将封装类型转换为基本数据类型。...怎么就自动装箱自动拆箱了呢? 上一段代码,看看哪是自动装箱自动拆箱: // 自动装箱 1....Integer a = 100; // 自动拆箱 2. int b = a; 自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX); 自动拆箱,相当于Java编译器替我们执行了...至此我们看完了自动装箱自动拆箱,以Integer例我们知道了使用 valueOf() 方法实现装箱,使用 intValue() 方法实现拆箱,接下来我们再结合几行代码重新回顾一下: 1.

    1.4K20

    深入浅出JVM(六)之前端编译过程与语法糖原理

    ,Java编译器可以分为:前端编译器、即时编译器和提前编译器最为常见的就是前端编译器javac,它能够将Java源代码编译为字节码文件,它能够优化程序员使用起来很方便的语法糖即时编译器是在运行时,将热点代码直接编译为本地机器码...)对比优点: 只需要改动编译器,Java虚拟机和字节码指令不需要改变因为泛型是JDK5加入的,为了满足对以前版本代码的兼容采用类型擦除式泛型缺点: 性能较低,使用没那么方便提供基本类型的泛型,只能自动装箱...componentType, list.size()); return instance;}增强for循环与可变长参数增强for循环 -> 迭代器可变长参数 -> 数组装载参数泛型擦除后会在某些位置插入强制转换代码自动装箱自动装箱...包装类的 == 就是去比较引用地址,不会自动拆箱条件编译布尔类型 + if语句 : 根据布尔值类型的真假,编译器会把分支中不成立的代码块消除(解语法糖)Lambda原理编写函数式接口 @FunctionalInterface...Java中编译器的分类开篇,深入浅出的解析前端编译的流程,Java中泛型、增强for循环、可变长参数、自动装箱、条件编译以及Lambda等语法糖的原理前端编译先将字符流转换为token流,再将token

    10521

    基本数据类型的包装类

    自动装箱与拆箱的功能事实上是编译器来帮你的忙,编译器在编译时期依你所编写的语法,决定是否进行装箱或拆箱动作。...例如: Integer i = 100; 相当于编译器自动您作以下的语法编译: Integer i = new Integer(100); 所以自动装箱与拆箱的功能是所谓的 “编译器蜜糖” (Compiler...自动装箱自动拆箱的案例代码: /** - 测试自动装箱和拆箱 - 结论:虽然很方便,但是如果不熟悉特殊情况,可能会出错!...(20); //自动装箱和拆箱,实际上是编译器替我们完成了代码自动编译,比如:Integer b = 23, 其实运行时执行的仍然是:Integer b = new Integer...(23); //自动装箱拆箱时,对于-128-127之间的值,编译器仍然会把它当做基本类型处理。

    77020

    重大线上事故!三元表达式引发的空指针问题

    还是以 Integer 例我们来看看自动装箱的过程: Integer obj = 10; // 自动装箱....我们来看看这段代码反编译后的文件,底层到底是什么原理: Integer obj = Integer.valueOf(10); int temp = obj.intValue(); 可以看见,自动装箱的底层原理其实就是调用了包装类的...那么,为什么编译器会进行自动拆箱呢?什么情况下需要进行自动拆箱呢?...原理分析 关于为什么编辑器会在代码编译阶段对于三目运算符中的表达式进行自动拆箱,其实在《The Java Language Specification》(后文简称 JLS,是Java 语言规范,是一切...在以上 6 种情况中,如果是涉及到自动拆箱的,一旦包装类的值 null,即 null.booleanValue(),就必然会发生 NPE(装箱不会,因为装箱是 Boolean.valueOf(null

    22530

    夯实Java基础系列2:Java基本数据类型,以及自动装箱里隐藏的秘密

    也就是说,虚拟机根本不知道有自动拆箱和自动装箱这回事;在将Java源文件编译为class文件的过程中,javac编译器自动装箱的时候,调用了Integer.valueOf()方法,在自动拆箱时,又调用了...实现总结:其实自动装箱自动封箱是编译器我们提供的一颗语法糖。在自动装箱时,编译器调用包装类型的valueOf()方法;在自动拆箱时,编译器调用了相应的xxxValue()方法。...包装类型 == 基本类型时,包装类型自动拆箱; 需要注意的是:“==”在没遇到算术运算时,不会自动拆箱;基本类型只会自动装箱对应的包装类型,代码中最后一条说明的内容。...在JDK 1.5中提供了自动装箱自动拆箱,这其实是Java 编译器的语法糖,编译器通过调用包装类型的valueOf()方法实现自动装箱,调用xxxValue()方法自动拆箱。...本文介绍了“真实的”自动装箱与拆箱,为了避免写出错误的代码,又从包装类型的源码入手,指出了各种包装类型在自动装箱和拆箱时存在的陷阱,同时指出了自动装箱与拆箱发生的时机。

    3.5K00

    C# 学习笔记(10)—— 可空类型、匿名方法、迭代器

    运算符可以很方便地设置默认值,避免了通过 if 和 else 语句来进行判断,从而简化了代码行数,提高了代码的可读性 可空类型的装箱和拆箱操作 既然值类型存在装箱和拆箱的过程,而可空类型属于值类型,那么自然也就存在装箱和拆箱操作了...如果 null,CLR将不会进行实际的装箱操作(因为 null 可以直接赋给一个引用类型变量);如果不为 null,CLR则从可空类型对象中获取值,并对该值进行装箱(即值类型的装箱过程) 当把一个已装箱的值类型赋给可空类型变量时...obj; Console.ReadKey(); } 匿名方法 什么是匿名方法 匿名方法,顾名思义,就是没有名字的方法。...而且,匿名方法会自动形成”闭包“ 迭代器 迭代器简介 迭代器记录了某个集合中的某个位置,它使程序只能向前移动。...当编译器看到yield return语句的时候,会在中间代码我们生成了一个IEnumerator接口的对象,这点可以用反射工具查看 yield return语句其实是 C# 中提供的另一个语法糖,简化了我们迭代器源代码

    17230

    Kotlin 内联类 inline class请了解一下

    也就是说,这个指令会获取index1和2的变量的值,并且把值放入栈顶。 那么经过ILOAD 1和ILOAD 2之后,栈内元素变成了 ?...大概意思就是inline class也需要装箱拆箱,就和Integer类和int类型一样。在有需要的时候编译器会对这两种类型做转换,转换的过程就是装箱/拆箱。...那对于inline class来说,什么时候需要拆箱,什么时候需要装箱呢?...override fun foo(): ICAny { return ICAny(4) } } 因为ICAny类在JVM中是Object类型,Any也是Object类型,编译器就会自动认为重写方法的返回值是和...类型的桥接方法,加上在代码中我们强制转型把B转成了A类,所以静态分析也会认为foo()方法的返回值是Any,就会导致foo2变量不会被装箱,所以类型就一直是Object,以上代码的打印结果也就是False

    61520

    一篇文章讲清楚Java基本数据类型,常量池,以及自动装箱的秘密

    也就是说,虚拟机根本不知道有自动拆箱和自动装箱这回事;在将Java源文件编译为class文件的过程中,javac编译器自动装箱的时候,调用了Integer.valueOf()方法,在自动拆箱时,又调用了...实现总结:其实自动装箱自动封箱是编译器我们提供的一颗语法糖。在自动装箱时,编译器调用包装类型的valueOf()方法;在自动拆箱时,编译器调用了相应的xxxValue()方法。...包装类型 == 基本类型时,包装类型自动拆箱; 需要注意的是:“==”在没遇到算术运算时,不会自动拆箱;基本类型只会自动装箱对应的包装类型,代码中最后一条说明的内容。...在JDK 1.5中提供了自动装箱自动拆箱,这其实是Java 编译器的语法糖,编译器通过调用包装类型的valueOf()方法实现自动装箱,调用xxxValue()方法自动拆箱。...本文介绍了“真实的”自动装箱与拆箱,为了避免写出错误的代码,又从包装类型的源码入手,指出了各种包装类型在自动装箱和拆箱时存在的陷阱,同时指出了自动装箱与拆箱发生的时机。

    6.3K20

    基本数据类型包装类

    2、包装类常用方法 从源代码的角度来看,基础类型和包装类型都可以通过赋值语法赋值给对立的变量类型,如下面的代码所示。...3.1、装箱 装箱就是java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱。...自动装箱编译器调用valueOf()将原始类型值转换成对象。...3.2、拆箱 拆箱就是java自动将对应的对象转换成原始类型值,比如将Integer对象转换成int的变量,这个过程叫做拆箱 自动拆箱时,编译器通过调用类似xxxValue()这类方法(如:intValue...3.3、什么时候会产生装箱与拆箱 3.3.1、赋值时 需要手动地进行类型转换,而现在所有的转换都是有编译器来完成。

    79610

    Java基础系列(十九):自动装箱自动拆箱

    自动装箱自动拆箱 ArrayList list = new ArrayList(); list.add(3); int x = list.get(0); 自动装箱 当我们添加...list.add(3); //实际上面的代码会被编译器自动的变成下面的这个代码 list.add(Integer.valueOf(3)) 编译器在其中所作的这个事情就叫做自动装箱。...int x = list.get(0); //实际上面的代码会被编译器自动的变成下面的这个代码 int x = list.get(0).intValue(); 编译器这其中所作的这个事情就叫做自动拆箱...(i1 == i2); System.out.println(i3 == i4); 这是一道经典的面试题,打印出来的结果是: true false 为什么会发生这样的事情,我们记得自动装箱的时候会自动调用...上面的代码中i1和i2的数值100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。

    32640

    Java中的自动装箱与拆箱

    为了让代码简练,Java 1.5引入了具有在原始类型和对象类型自动转换的装箱和拆箱机制。...但是自动装箱和拆箱并非完美,在使用时需要有一些注意事项,如果没有搞明白自动装箱和拆箱,可能会引起难以察觉的bug。 本文将介绍,什么自动装箱和拆箱,自动装箱和拆箱发生在什么时候,以及要注意的事项。...什么自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。...自动装箱拆箱要点 自动装箱编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。...所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作。

    59220

    不了解这12个语法糖,别说你会Java!

    因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。...先来看个自动装箱代码: ? 反编译后代码如下: ? 再来看个自动拆箱的代码: ? 反编译后代码如下: ?...当if(ONLINE)false的时候,编译器就没有对其内的代码进行编译。 所以,Java语法的条件编译,是通过判断条件常量的if语句实现的。...其实断言的底层实现就是if语言,如果断言结果true,则什么都不做,程序继续执行,如果断言结果false,则程序抛出AssertError来打断程序的执行。...以上代码输出结果:2!由于经过类型擦除,所有的泛型类实例都关联到同一份字节码上,泛型类的所有静态变量是共享的。 自动装箱与拆箱——对象相等比较 ? 输出结果: ?

    71420

    包装类的认识

    (其他包装类也是类似的) 下面我们看下Integer内部的doublevalue和intvalue代码自动装箱自动拆箱 ❤️❤️可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担...自动装箱 ❤️❤️自动装箱的实现是通过Java编译器在编译时进行的。...,编译器自动调用Integer.valueOf()方法进行装箱。...Integer num = 10; // 自动装箱 自动拆箱 ❤️❤️自动拆箱(Autoboxing)是指当我们将一个包装类对象赋值给一个基本数据类型变量时,编译器自动进行拆箱操作,自动调用对应的方法来将包装类对象转换为基本数据类型...128; System.out.println(a == b);//输出true System.out.println(c == d);//输出false } ​ ​​​​​​​上述代码什么输出如上结果

    10610

    Java中的自动装箱与拆箱

    为了让代码简练,Java 1.5引入了具有在原始类型和对象类型自动转换的装箱和拆箱机制。...但是自动装箱和拆箱并非完美,在使用时需要有一些注意事项,如果没有搞明白自动装箱和拆箱,可能会引起难以察觉的bug。 本文将介绍,什么自动装箱和拆箱,自动装箱和拆箱发生在什么时候,以及要注意的事项。...什么自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。...自动装箱拆箱要点 自动装箱编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。...所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作。

    72920

    夯实Java基础系列8:深入理解Java内部类及其实现原理

    也就是说,虚拟机根本不知道有自动拆箱和自动装箱这回事;在将Java源文件编译为class文件的过程中,javac编译器自动装箱的时候,调用了Integer.valueOf()方法,在自动拆箱时,又调用了...实现总结:其实自动装箱自动封箱是编译器我们提供的一颗语法糖。在自动装箱时,编译器调用包装类型的valueOf()方法;在自动拆箱时,编译器调用了相应的xxxValue()方法。...包装类型 == 基本类型时,包装类型自动拆箱; 需要注意的是:“==”在没遇到算术运算时,不会自动拆箱;基本类型只会自动装箱对应的包装类型,代码中最后一条说明的内容。...在JDK 1.5中提供了自动装箱自动拆箱,这其实是Java 编译器的语法糖,编译器通过调用包装类型的valueOf()方法实现自动装箱,调用xxxValue()方法自动拆箱。...本文介绍了“真实的”自动装箱与拆箱,为了避免写出错误的代码,又从包装类型的源码入手,指出了各种包装类型在自动装箱和拆箱时存在的陷阱,同时指出了自动装箱与拆箱发生的时机。

    3.5K00
    领券