1、基本数据类型byte、short、int、long、char、boolean的包装类用到了常量池,大小在127以内的从常量池获取;
2、基本数据类型中float、double没有实现常量池技术;
3、java中字符串实现常量池技术;
public class Test {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 == i2);//true,都指向对象池的一个空间地址
i1 = 200;
i2 = 200;
System.out.println(i1 == i2);//false,超过对象池大小127,则各自开辟新的空间地址
i1 = new Integer(100);
i2 = new Integer(100);
System.out.println(i1 == i2);//false,2个不同的引用地址
Float f1 = 100f;
Float f2 = 100f;
System.out.println(f1 == f2);//false,float,double 没有实现对象池技术,相当于各自开辟自己的空间
String s1= "zhansan";
String s2= "zhansan";
System.out.println(s1 == s2);//true,string 实现了对象池技术,s1 s2都指向对象池的一个空间地址
String s3= new String("zhansan");
System.out.println(s2 == s3);//false,s3指向新开辟的堆空间
}
}
上述示例字符串内存示意图如下:
上图中s4="hello,"+s1,会在常量池中增加“hello,zhangsan",如果有频繁操作字符串的场景,为了不在常量池中出现大量的中间变量,建议适用StringBuilder,通过StringBuilder生成的字符串不会在常量池生成额外的中间变量
StringBuilder builder = new StringBuilder("hello,");
builder.append("zhangsan,").append("你好");//不会在常量池中新增”hello,zhangsan,你好“的字符串
System.out.println(builder);