文章链接
java语言-基本数据类型-装箱和拆箱
面5笔5java 1.5 的自动装箱拆箱机制是编译特性还是虚拟机运行时特性?分别是怎么实现的?
答:java 1.5 开始的自动装箱拆箱机制其实是编译时自动完成替换的,装箱阶段自动替换为了 valueOf 方法,拆箱阶段自动替换为了 xxxValue 方法。对于 Integer 类型的 valueOf 方法参数如果是 -128~127 之间的值会直接返回内部缓存池中已经存在对象的引用,参数是其他范围值则返回新建对象;而 Double 类型与 Integer 类型类似,一样会调用 Double 的 valueOf 方法,但是 Double 的区别在于不管传入的参数值是多少都会 new 一个对象来表达该数值(因为在指定范围内浮点型数据个数是不确定的,整型等个数是确定的,所以可以 Cache)。
注意:Integer、Short、Byte、Character、Long 的 valueOf 方法实现类似,而 Double 和 Float 比较特殊,每次返回新包装对象,对于两边都是包装类型的比较 = = 比较的是引用,equals 比较的是值,对于两边有一边是表达式(包含算数运算)则 = = 比较的是数值(自动触发拆箱过程),对于包装类型 equals 方法不会进行类型转换。