Java 中字符串的安全性和不变性

问题描述 投票:0回答:1

在Java中,我们都知道字符串是不可变的。安全性是原因之一,因此用户名等无法更改。但是使用 String

replace()
我们可以改变 String 变量的值。

例如:

String s = "oooo-hhh-oooo";
s =s.replace('h','s');
System.out.println(s);  

输出:oooo-sss-oooo

那么出于安全原因说字符串的不变性有多可靠?

当我试图找到原因时,我碰巧遇到了以下解释。 解释:“最初在字符串池中创建为 oooo-hhh-oooo。当对原始值调用replace()时,即 oooo-hhh-oooo 在字符串池内存中保持不变,而新字符串 oooo-sss- ssss 在内存中创建,其引用被分配给 s。”

这种解释与 Java 提供的安全强度或声称 String 高度安全的说法相矛盾。

寻找字符串在 Java 语言中扮演高度安全角色的清晰图片。

java string immutability
1个回答
2
投票

通过

s = s.repalce('h', 's')
,您已为 s
分配了
一个新字符串,但并未更改原始字符串的值。

重点是,如果您将

s
保存在其他地方,为该变量分配新值不会(也不能)影响您保存的值:

String s = ="oooo-hhh-oooo";
String saved = s;
s = s.replace('h', 's'); // This does NOT affect saved
此后

saved
仍然是
oooo-hhh-oooo
。只有
s
将其值更改为
oooo-sss-ooo

© www.soinside.com 2019 - 2024. All rights reserved.