类型: 质量问题
不能直接使用==或!=操作符来比较的两个基本数据类型的包装类型的值,因为这些操作符比较的是对象的引用而不是对象的值。
不过由于Java的缓存机制,所以如果基本类型的包装类是一个整数且在-128和127之间,或是布尔类型true或false,或者是’\u0000’和’\u007f’之间的字符文本,可以使用==或!=进行比较。也就是说,如果使用了基本类型的包装类型(除去Boolean或Byte),则会缓存或记住一个值区间。对于值区间内的值,使用==或!=会返回正确的值,而对于值区间外的值,将返回对象地址的比较结果。
例如:在这个不符合规范的代码示例中:使用==操作符来比较两个Integer对象的值。然而,这个==操作比较的是对象的引用,而不是对象的值。
public class Wrapper {
public static void main(String[] args){
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i1 == i2);
System.out.println(i1 != i2);
System.out.println(i3 == i4);
System.out.println(i3 != i4);
}
}
Integer类只能保证缓存介入-128~127的整型数值,当使用相等操作符的时候,这会导致在这个范围之外的等价数值的比较是不相等的。比如,在那些不缓存任何值的JVM虚拟机中,运行程序会产生以下结果:
true
false
false
true