Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean 直接返回True Or False。如果超出对应范围仍然会去创建新的对象。
Integer举例说明
public class Test1 {
public static void main(String[] args) {
Integer i1 = 5;
Integer i2 = 5;
System.out.println((i1==i2));//true
Integer i3 = new Integer(5);
Integer i4 = new Integer(5);
System.out.println((5==i3)); //true
System.out.println((128==i3)); //false
System.out.println((i4==128)); //false
System.out.println((i3==i4)+" "+i3.hashCode()+" "+i4.hashCode()); //false 6 6
}
}
}
结论
- 当数值范围为-128~127时:如果两个new出来Integer对象,即使值相同,通过"= ="比较结果为false,但两个对象直 赋值,则通过"= ="比较结果为true
- 当数值不在-128~127时,无论通过哪种方式,即使两个对象的值相等,通过“==”比较,其结果为false
- Integer对象的hash值为数值本身
为什么范围在-128——127之间?
在Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为-128~127时的Integer对象。