Java基本类型包装类常量池问题

874 阅读1分钟

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,地址不同
    
}