首先看一道题,
Double d1 = 100.0;
Double d2 = 100.0;
Double d3 = 200.0;
Double d4 = 200.0;
System.out.println(d1==d2);
System.out.println(d3==d4);
问输出的内容是什么?
我开始觉得都是true
可惜答案,都是false
错的一塌糊涂
在Java1.5以后,就有了自动拆装箱的语法。
装箱时自动调用XXX.valueOf();
拆箱时调用XXXValue方法。
对于8种基本类型而言,除浮点型Double、Float,其余类型都有各自的缓存池,如下:
包装类型 | 缓存赋值范围 |
---|---|
Boolean | 全部缓存 |
Byte | [-128,127] |
Character | <=127 |
Short | [-128,127] |
Integer | [-128,127] |
Long | [-128,127] |
对于上述这6种类型而言,赋值操作将会从缓存池取,如果缓存池中已经有,那么赋值操作使用的就是同一对象,如果超出缓存范围,那么结果就不可能为true。
而恰好浮点类型都是没有缓存的,所以d1、d2,d3、d4视为不同的对象,所以答案为false/false。
在阿里的Java规范中,明确过包装类型之间的比较应该使用equals方法。