Java的基本类型包装类中有6中实现了常量池技术:
Byte , Short,Integer,Long ,Characher ,Boolean
。另外两种浮点数类型Double和Float
没有实现该技术。
六种实现常量池技术的包装类中Byte,Short,Integer,Long,Character这5种整型的包装类也只是在 [-128,127)之间才可使用常量池,不负责创建和管理[-128,127)之外的类的对象。
-
若==左右两侧都是基本类型,比较的是值的大小;
-
若==左右两侧有一个是包装类,则将包装类转换为基本类型后比较值的大小;
-
若==左右两侧都是包装类型,则比较的是左右两个对象的地址。
public static void main(String[] args) {
Integer i1 = 127;
int i2 = 127;
System.out.println(i1==i2);//true,比较值的大小
Integer i3 = Integer.valueOf(127);
Integer i4 = new Integer(127);
System.out.println(i1==i3);//true,i1,i3指向常量池
System.out.println(i3==i4);//false,引用指向的地址不同,i3指向常量池,i4在堆内存中新开辟一块空间
int i5 = 128;
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i5==i6);//true,int与Integer比较的是值
System.out.println(i6==i7);//false,超过【-128,127】缓存范围,需要new对象,二者地址不同
Integer i8 = Integer.valueOf(128);//超过127,new对象
Integer i9 = new Integer(128);
Integer i10 = new Integer(128);
System.out.println(i8==i9); //false,地址不同
System.out.println(i9==i10);//false,地址不同
}