直接上代码,当int值在一个字节范围内(-128~127)时:
当int值不在一个字节范围内时,例如128(注意与第一张图结果的区别)如下图:
我们根据比较结果逐行分析:
第一行:可以看到 int 类型的数据与Integer对象的比较全部都为 true,这是因为,当int与Integer比较时,java会将Integer类型自动拆箱转换为 int 再进行比较,所以到最后是 int 和 int 之间的值的比较,所以无论int值是否在一个字节范围内,比较结果均为true。
第二行:当我们把 int 值直接赋值给 Integer 对象,java会对 int 值进行自动装箱,而什么是自动装箱呢,就是调用 Integer 的valueOf方法,所以这里 Integer b = 100 和 Integer c = Integer.valueOf(100) 的效果完全是一样的,那为什么当int值为100时,比较结果为true,而当int值为128时比较结果为false呢?
我们来看源码:
这是因为Integer类在自动装箱时,如果int的值在一个字节范围内,直接返回缓存,如果超出了一个字节,则会新建一个对象返回,所以第一张图片b和c比较为true,而第二张图片比较为false。 而由于d和e均为新建了一个对象,所以b和他们的比较均为false。
第三行:由于d和e均为新建了一个对象,而==默认比较的是对象的地址,所以除了与int值比较会自动拆箱转换为int值进行值的比较之外,d和e与除了a之外的任何对象的==比较均为false。
第四行:参考第三行。