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的重要区别。