java之String不可变思考

String属于引用类型,创建的对象放在堆上,引用放在栈上

String c = "aaa";

在堆上分配一片内存,创建对象保存数据aaa,而c属于在创建在栈上的引用,指向保存数据堆的位置

image

这时再添加一个String c=”bbb”;

这时堆上开辟一个新内存,保存数据bbb,然后c指向bbb

image

然后再String d=”bbb”;  因为bbb已经存在,并且被保存在了字符串常量池里面,所以

d就不用判断了一下,所要创建的对象存在,不用再创建了,直接引用d指向bbb就行了

这时c与d指的是同一个对象

image

创建字符串有两种方式

1.使用new运算符

String str = new String("Hello");

2.使用字符串常量或者常量表达式    这个创建字符串的方式才使用字符串常量池

String str="Hello"; //(字符串常量) 或者

String str="Hel" + "lo"; //(字符串常量表达式)

String a="Hello";

String d="Hel";

String str=d+”lo”;    这里a==str  false

对于这种类型的拼接,如果d在编译器可以确定值结果为true。否则为false,比如final String d=”Hel”

 

上面看完了图理解了字符串的拼接以及为什么说String不可变  从底层看一下不可变的原因

image

首先设置了private访问权限,外部无法直接访问,接着加上final无法被继承,并且没有提供setValue的公共方法,所以String对象建立后无法改变

 

其中substring, replace, replaceAll这样方法可以修改String对象的值,源码中修改方式是新建String一个对象,然后返回

接着把新的对象重新赋值给    引用,所以也是没有改变String对象

比如

String dString="12645";

String eString=dString.replace('1','3');

这时eString输出32645,而dString仍旧不变,

所以如果只dString.replace('1','3');这样,但是没有将新建的对象赋值给引用是无法输出32645的,因为dString不改变

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值