栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中字符串的不变性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371935.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号