java号码池_java字符串常量池

字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。

测试:

String str1 = new String("cockcokcockcokc");

String str = "cockcokcockcokc";

String str2 = str.intern();

String str3 = str1.intern();

String str4 = "cockcokcockcokc";

String str5 = "cockcok"+"cockcokc";

String str6 = "cockcok"+new String("cockcokc");

String str7 = str6.intern();

System.out.println(str == str1);//false

System.out.println(str == str2);//true

System.out.println(str2 == str3);//true

System.out.println(str == str4);//true

System.out.println(str == str5);//true

System.out.println(str == str6);//false

System.out.println(str == str7);//true

System.out.println(str == str6);//false

System.out.println(str1 == str6);//false

System.out.println(str == str7);//true

HEAP视图:

0ca6a5a4e8492724d2fa1c23e71fadec.png

下面来分析:

1、String str1 = new String("cockcokcockcokc");

建立了两个对象,因为常量池中没有"cockcokcockcokc"字符串引用,所除了在堆区建立的String对象外,常量池也建立了一个String对象

2、String str = "cockcokcockcokc";

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str

3、String str2 = str.intern();

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str2

4、String str3 = str1.intern();

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str3

5、String str4 = "cockcokcockcokc";

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str4

6、String str5 = "cockcok"+"cockcokc";

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str5

7、String str6 = "cockcok"+new String("cockcokc");

建立了一个对象,因为常量池中"cockcokcockcokc"字符串引用存在于字符串常量池,所以只在堆区建立了一个String对象

8、String str7 = str6.intern();

因为"cockcokcockcokc"字符串引用存在于字符串常量池,所以直接将常量池中的字符串的引用返回给str7

总结:

当第一次使用String s = new String("characterString")时,会在堆中建立两个Stirng对象,一个引用返回给s,另一个引用维护在常量池中,用inter()方法取得的永远是常量池中的引用;若第一次使用String s="characterString",会在堆中建立一个String对象,维护在常量池中,并返回给s,所以,平时使用Stirng的时候,尽量不要使用new String("characterString")的方式初始化String

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值