c语言字符串不可变,关于String不可变的一些理解

一直对String不可变感到疑问, 不知为何说String是不可变的, 有人说final, 有人说其字符串不可改变, 但是我始终不能理解字符串不能改变的真正含义, 遂自行琢磨了一番, 也有了自己的一番见解, 希望记录下来, 日后有新的见解可以随时修改和比较.

首先final保证String是不可变类(无法被继承,无法被子类修改破坏其内部状态), String的属性也都是final变量, 所以其属性也是不可被破坏的, 属性状态也无法被改变!

然后是String的内部方法处理方式, 对String的操作方法最终都会返回一个新的String对象, 这就直接导致了返回的是一个新的内存地址引用, 而不是将原内存地址引用的那块内存的值进行修改!(这里就是不可变性重要的地方)

只用文字难免有些枯燥和不好理解, 用代码说明一下. 用方法和形参的方式更清晰的说明一下同样的情况普通对象和String对象不同!

/*** 形参变化测试类*/

public classhappyTwo {public static voidmain(String[] args) {

User user= newUser();

user.name= "zhangsan";

System.out.println(user.name);

tryChangeObj(user);

System.out.println(user.name);

String str= "this is str";

System.out.println(str);

tryChangeStr(str);

System.out.println(str);

}static classUser{publicString name;

}public static voidtryChangeStr(String formStr){

formStr= "hi, this is formStr";

}public static voidtryChangeObj(User formUser){

formUser.name= "lisi";

}

}

打印信息如下:

ffd4b97e3593a628c384c946394ef0dd.png

来仔细分析一下:

1. 对象user, name属性的值刚开始是zhangsan, 因为Java是值传递的, 所以formUser得到了user的内存地址引用值, 此时, formUser直接指向user指向的那块内存, formUser修改了该内存的值, user的内容当然也会变化, 相当于他们其实都是该内存的一个快捷方式.

2. 为什么String不会变化呢? 难道formStr拿到的不是str的内存地址引用的值吗?

formStr拿到的当然也是str的内存地址引用的值, 也就是说在

public static void tryChangeStr(String formStr) 这一行当中, formStr和str指向的内存是一样的!

变化发生在下面这一行👇👇👇

formStr = "hi, this is formStr";

刚刚我们说了, String的所有修改操作都会直接返回一个新的String, 这一行给formStr赋新的字符串了, 此时formStr指向的内存地址就变成了该字符串的内存地址了, 所以此时formStr和str当然不是同一个对象了, 它两的值肯定也不会再相同了!

以上就是我的个人理解, 我理解的不可变是最开始初始化String对象后存储String对象的那块内存中的值不可变, 而不是String对象的引用地址不能改变, 如果理解有误, 希望后期自己可以发现并纠正.

原文出处:https://www.cnblogs.com/fanerwei222/p/11683720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值