java字符串的不可变性

字符串的不可变性

在了解字符串的不可变性之前 我们先要了解String对象 以及 String字符串在内存中存储的位置

查看String源码看到String两个成员变量 一个value[] 另一个是hash :
在这里插入图片描述

当我们运行下面代码

String str1 = "abcd";
String str2 = new String("abcd");
String str3 = "abcd";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
运行结果为:
false 
ture

此时我们观察它们在内存中的布局
在这里插入图片描述

被双引号引起来的字符串通常都会放在常量池中,如果常量池中有,就会使用常量池中的


那String为什么不可变呢

有的说String类是被final修饰的,被final修饰的类我们说这种类是不能被继承的

也有的说是String类中的成员变量value数组是被final修饰的

分析下面代码

String str1 = new String("abcd");

当我们定义了一个Sting类型的str1变量的时候,
查看String的构造方法发现
在这里插入图片描述
它把字符串的value以数组的形式给了当前对象str1的value了,
而value 是被final修饰的数组,说明value 只能引用当前的对象
那我们能不能通过value 去修改指向对象的值呢? 答案是可以. 但是value 也是被private 修饰的!!!,
也就是说是被封装的,
在这里插入图片描述
那被封装的我们可以使用提供的get set方法啊
但是 纵观String类的所有方法,没有发现String有get set 方法,
所以你不能改变String的值
所以字符串它是不可变的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值