关于字符串创建在内存中的活动

                                                      ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019081712315163.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzI5OTcx,size_16,color_FFFFFF,t_70)**

*String 类在java源码中是定义为final的意味着它是一个常量; String c=“java”+“c++”;这条语句首先在编译阶段(也就是生成class文件阶段)编译器会识别出"java"和"c++“是一个字符串常量;编译器会做常量的运算,生成"javac++”,然后编译成class文件,文件中String c的值已经变成"javac++”;然后class文件进入运行阶段,由类加载器加载载进内存中,java虚拟机会为常量分配内存空间,而字符串常量"javac++"会被放进字符串常量池中 此时javac++已经是一个对象了,所以字符串常量池的字符串都是可以认为是new出来的;然后将"javac++"的地址值赋值给变量String c,此时c指向字符串“javac++”在字符串常量池的地址值。


下面是一张将以上变量设置为常量的图运算的结果
在这里插入图片描述

在这里或许有人要问了!String a=new String(“java”);在内存中又是怎么样呢? 首先此字符串是new出来的;所以编译期间不会运算;,在运行期间;jvm为此字符串在堆中开辟 一块内存空间,jvm先会在字符串常量池中找有没有叫“java”的字符串,如果没有会在字符串常量池中new出一个“java” 字符串常量,然后把这个常量的地址值传回给堆空间的引用。所以new String(“java”);里面放的是字符串常量池里面“java”的地址值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值