分析String的对象创建问题

一、String str = new String()+"a";创建几个对象?与String str1 = new String("b")+"c";和String str2 = new String("")+"d";结果相同吗?

答:创建原理是一样的。

str = new String()+"a":new String()会创建一个堆内存对象,"a"会创建一个字符串常量池的常量"a"对象,使用+拼接,会创建一个StringBuilder对象,拼接""+"a",编译时会初始化成String str = "a",放入字符串常量池中。加上StringBuilder对象共有4个对象。 

String str1 = new String("")+"c";String str2 = new String("b");同上。

二、String str = new String("a")+new String("b");会创建几个对象?

new String("a")先去字符串常量池查找有没有"a"常量对象,没有则添加一个,然后此处是new的,所以还会在堆内存创建一个对象,同理new String("b")也是创建了两个对象,使用+会创建StringBuilder对象,调用其append()方法拼接,生成一个新的常量对象放入字符串常量池中。加上StringBuilder对象共有6个对象。

三、创建字符串对象的方式

1、String s = "abc";

2、String s2 = new String("def");

3、String s = s+s2;

4、final String s1 = "123";

      final String s2 = "456";

String s = s1+s2;

第一种使用字面量直接创建,先去常量池查找有没有,没有就创建,有之间返回其引用给s(s称为句柄也就是引用对象,存的是String类对象的引用--我把引用理解为地址)。

第二种先去查找常量池有没有"def"常量对象,没有就在常量池创建"def"常量对象,有就不创建,然后在堆内存创建对象并返回堆内存对象的引用给句柄s2。

第三种JVM在编译时会优化成StringBuilder的拼接,String s=new String("abcdef");这里区别于String s = "abc"+"def",优化成String s = "abcdef";

第四种由于是字符串常量拼接,在JVM编译时会直接替换为常量,String s="abc"+"def" ,创建StringBuilder对象调用append()方法区拼接,String s="abcdef";先去字符串常量池查找,找到返回其引用给句柄s,找不到创建并返回其引用。

这里说一下intern()方法,作用:区字符串常量池查找是否存在该字符串(用equals()方法比较),如果存在就返回其引用,不存在就创建对象并返回其引用。(该操作为JDK1.6及以前)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值