JAVA小知识11:String到底创建几个对象?

String在生成的过程中如何创建对象?

String s1 = new String("hello")

String s2 = "world"

String s3 = new String("x") + new String("y")

String s5 = new String("abc") + "def"

String s6 = new String("x") + new String("y") + new String("z");

上述String对象在创建的过程中都创建了几个对象?这就是本文要探讨的问题。

分析以下简单问题,这个过程创建了几个对象?

String s1 = new String("hello");

答案:1个或者2个

解析:首先就是"hello",如果常量池中没有这个字符串,首先会在常量池中创建这个对象
           其次是堆中的 new String("hello") 对象
           所以是2个,如果常量池中有hello字符串对象,则为1个

字符串池

由于字符串是不可变的,Java 可以有效地将字符串放入字符串池中。字符串池是一个特殊的内存区域,用于存储常用的字符串对象。当你创建一个字符串对象时,Java 首先会检查字符串池中是否已经存在相同内容的字符串,如果存在,就会返回池中的引用,而不会创建新的对象。这可以节省内存,并提高性能。

String s2 = "world";创建了几个对象?

答案:1个或者0个

解析:只有常量池中创建world对象,或者本身就有不用创建直接指向

上难度

String s3 = new String("x") + new String("y");
创建了几个对象? 

答案:6个或者4个

解析:首先是常量池中的x,y两个对象
           其次是两个new String( )对象
           生成过程中用到了+号,则会有一个StringBuilder 对象用于拼接
           最后是拼接结束后StringBuilder.toString() 生成的 String 对象。

StringBuilder 是一个可变对象,而 String 是不可变对象。在拼接字符串的过程中,StringBuilder 提供了更高效的方式,因为它不需要像 String 那样每次拼接都创建一个新的字符串对象。最终,我们需要得到一个不可变的字符串结果,这时就需要使用 toString() 方法

调用 StringBuilder.toString() 会生成一个新的 String 对象,该对象包含 StringBuilder 当前内部字符数组的副本,并且这个 String 对象是不可变的。

String s5 = new String("abc") + "def"; 创建了几个对象? 

  1. 常量池中的 "abc" 对象(如果已经存在,则不再创建)。
  2. 常量池中的 "def" 对象(如果已经存在,则不再创建)。
  3. 堆中的 new String("abc") 对象。
  4. StringBuilder 对象(用于拼接)。
  5. StringBuilder.toString() 生成的 String 对象。

总共:5 个对象(如果 "abc""def" 已存在于常量池中,则为 3 个)。

String s6 = new String("x") + new String("y") + new String("z");

  1. 常量池中的 "x" 对象(如果已经存在,则不再创建)。
  2. 常量池中的 "y" 对象(如果已经存在,则不再创建)。
  3. 常量池中的 "z" 对象(如果已经存在,则不再创建)。
  4. 堆中的 new String("x") 对象。
  5. 堆中的 new String("y") 对象。
  6. 堆中的 new String("z") 对象。
  7. StringBuilder 对象(用于拼接 "x""y")。
  8. StringBuilder.toString() 生成的中间 String 对象(拼接 "x""y" 生成的)。
  9. StringBuilder 对象(用于拼接上一步的结果和 "z")。
  10. StringBuilder.toString() 生成的最终 String 对象。

总共:10 个对象(如果 "x""y""z" 已存在于常量池中,则为 7 个)。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值