new string会在常量池中创建吗_Java中关于String不同创建方式及不可变性的内存解析...

请给出下列程序的运行结果:

872637e33617311d3f2304b2cf7a2daf.png

1.main主程序中第一行代码创建ex对象:

StringTest ex = new StringTest();

内存图为:

706d3653de1163dd5d48fd4ba7425302.png

2.执行ex.change(ex.str, ex.ch);语句,进入change方法中,在栈中生成方法的形参,由于ex.str和ex.ch为引用数据类型,将ex.str和ex.ch的地址值分别传入change方法中形参str和ch(关于方法中形参的传递知识,可了解Java中的值传递机制

3ba7c1f1037c4fa3798f68341a731578.png

3.执行change方法中的str = "test ok";和ch[0] = 'b';语句。由于字符串类型不可变性(在String源码中声明为final类型),即字符串一旦创建便不可更改,如果要对字符串进行重新赋值,需要在字符串常量池中新建(字符串常量池中相同的字符串只存在一个,如果要赋的值已经有,则把该字符串的地址值赋给要赋值的变量),所以change方法中的str指向新创建的test ok字符串

646071fa490fb7c5fb612db1bd484911.png

4.change方法结束,Java回收机制对形参变量回收,由于字符串常量池中tesk ok没有被利用,因此也自动回收,故最终ex.str和ex.ch的输出为good和best

afec45e8cd91ca8019b166402d31a680.png

复习时发现上次发的文章有点小瑕疵,没有考虑到属性中String类型的创建方式为new的方式(所以默认为字面量的方式定义了,此方式的内存图请参考上面),因此增加了通过new方式创建str的内存图解:

请给出下列程序的运行结果:

66e610845fb127562d2fc08ddfa3982e.png

1.main主程序中第一行代码创建ex对象:

StringTest ex = new StringTest();

通过new的方式创建String,会在堆空间创建对象用来存储String中的字符数组value的值

内存图为:

105979f2aeb69f31ebc8e1ef29a6f57d.png

2.执行ex.change(ex.str, ex.ch);语句,进入change方法中,在栈中生成方法的形参,由于ex.str和ex.ch为引用数据类型,将ex.str和ex.ch的地址值分别传入change方法中形参str和ch(关于方法中形参的传递知识,可了解Java中的值传递机制

8d055d01edac9bfec9bdb5515fc1ad72.png

3.执行change方法中的str = "test ok";和ch[0] = 'b';语句。由于字符串类型不可变性(在String源码中声明为final类型),即字符串一旦创建便不可更改,如果要对字符串进行重新赋值,需要在字符串常量池中新建(字符串常量池中相同的字符串只存在一个,如果要赋的值已经有,则把该字符串的地址值赋给要赋值的变量),所以change方法中的str指向新创建的test ok字符串

4c6f4aed9af01ba95b067cf0a21c338e.png

4.change方法结束,Java回收机制对形参变量回收,由于字符串常量池中tesk ok没有被利用,因此也自动回收,故最终ex.str和ex.ch的输出为good和best

deb18e8a0baa8ac0f70d7f0e1c64cfa2.png
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值