先来看一下示例:
是不是觉得很奇怪?
先搞清楚==的比较:
1、对于基本数据类型,==比较的是值。
2、对于引用数据类型,==比较的是他们在内存中的存放地址。如果两个引用指向同一个对象,那么==的结果就是true;否则即使内容相同,那==也不会是true。
打开Integer的源码,会发现有这么一段代码
也就是说,对于-128-127之间的数,赋值的时候会直接从缓存IntegerCache中获取,不会再创建新的对象。因此,上面的变量a和b指向同一个对象,因此==比较的结果是true,c和d是不同的对象,内存地址就不一样,所以==比较的结果是false。
看完了Integer,不妨看下Double
我淦!这又是什么情况?不急,看下源码先
每次赋值都会创建一个新的对象,为什么呢?因为在某个范围内,整数是有确切的个数的,但似乎浮点数却没有确切的个数。
总结:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。
有人可能会问:那Boolean类型呢?
至于原因,看下Boolean源码
其中TRUE和FALSE是定义的两个静态成员变量。
最后,再来看下下面的程序结果:
第1、2点没啥疑问,对于后面几点做下说明:
当 "=="运算符的两个操作数,如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。