废话不多说看代码:
Integer a = 100;
Integer b = 100;
a == b 表达式结果为true
a.equals(b) 表达式结果为true
Integer a = 1000;
Integer b = 1000;
a == b 表达式结果为false
a.equals(b) 表达式结果为true
为什么?
包装类型不应该使用“==”运算符比较其值是否相等,因为它比较的是地址。比较引用类型的变量所指向的值是否相等请使用equals方法。
既然比较的是地址,那么为什么上半部分成立而下半部分不成立?
在上半部分中,a和b是同一地址。因为自动装箱规范要求boolean、byte、char <= 127、介于-127到128之间的short和int被包装到固定的对象中,也就是说:上半部分的a和b都被包装在了一个对象中,所以它们的地址相同。
所以在下半部分,a和b的值都大于上述规定,被包装在了不同的对象中,所以表达式“a == b”比较它们的地址其表达式结果为false。
请记住:比较引用类型的变量所指向的值是否相等使用equals方法。
还要记住:自动装箱规范要求boolean、byte、char <= 127、介于-127到128之间的short和int被包装到固定的对象中。
参考了《Java核心技术 第11版 卷一》