java字符串的不变性_Java中字符串的不变性

小编典典

str不是对象,而是对对象的引用。"Hello"和"Help!"是两个不同的String对象。因此,str指向一个字符串。你可以更改其指向的内容,但不能更改其指向的内容。

以下面的代码为例:

String s1 = "Hello";

String s2 = s1;

// s1 and s2 now point at the same string - "Hello"

现在,没有什么1,我们可以做些什么来s1会影响价值s2。它们引用同一个对象-字符串"Hello"-但该对象是不可变的,因此无法更改。

如果我们做这样的事情:

s1 = "Help!";

System.out.println(s2); // still prints "Hello"

在这里,我们看到了改变对象和更改参考之间的区别。s2仍然指向与最初设置的对象相同的对象s1。设置s1为"Help!"仅更改引用,而String最初引用的对象保持不变。

如果字符串是可变的,我们可以这样做:

String s1 = "Hello";

String s2 = s1;

s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string

System.out.println(s2); // Prints "Hallo"

编辑以响应OP的编辑:

如果你查看String.replace(char,char)的源代码(也可以在JDK安装目录的src.zip中找到它-一个专业技巧是在你想知道某事真正起作用时去那里查看),你会看到它确实是以下内容:

如果oldChar当前字符串中有一个或多个出现,请复制当前字符串的副本,其中所有出现的oldChar都替换为newChar。

如果oldChar当前字符串中不存在,则返回当前字符串。

是的,"Mississippi".replace('i', '!')创建一个新String对象。同样,以下内容成立:

String s1 = "Mississippi";

String s2 = s1;

s1 = s1.replace('i', '!');

System.out.println(s1); // Prints "M!ss!ss!pp!"

System.out.println(s2); // Prints "Mississippi"

System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects

现在,你的作业是查看上面的代码在更改s1 = s1.replace('i', '!');为s1 = s1.replace('Q', '!');时的作用。

1实际上,它是可能的突变的字符串(和其他不可变的对象)。它需要反射,非常非常危险,除非你真的有兴趣破坏程序,否则永远不要使用它。

2020-02-25

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值