Java 8种基本类型包装类和String的常量池

Byte,Short,Integer,Long

通过如下代码输出可以看出常量池数值范围为-128~127。

Integer i1 = -129;
Integer i2 = -129;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = -128;
i2 = -128;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = 127;
i2 = 127;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = 128;
i2 = 128;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 false
i1=i2 true
i1=i2 true
i1=i2 false

Character

通过如下代码输出可以看出常量池数值范围为0~127。

Character i1 = (char)-1;
Character i2 = (char)-1;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)0;
i2 = (char)0;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)127;
i2 = (char)127;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)128;
i2 = (char)128;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 false
i1=i2 true
i1=i2 true
i1=i2 false

Boolean

通过如下代码输出可以看出它也具有常量池。

Boolean i1 = true;
Boolean i2 = true;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 true

Float,Double

Float和Double无常量池。

Float i1 = 127F;
Float i2 = 127F;
System.out.println("i1=i2\t" + (i1 == i2));

Double i3 = 127D;
Double i4 = 127D;
System.out.println("i3=i4\t" + (i3 == i4));

输出结果:
i1=i2 false
i3=i4 false

String

引用文章:
https://tech.meituan.com/in_depth_understanding_string_intern.html
简单总结:可以通过使用双引号声明出来的String对象的方式和String.intern的方式在字符串常量池中生成对象。若字符串常量池中对象已存在,则无需重复生成对象。同时注意1.6和1.7的重要区别。

你可能感兴趣的:(Java 8种基本类型包装类和String的常量池)