为什么字符串在Java中是不可变的或最终的 正如我所说的,这是java中重要的字符串访问问题,它从“什么是字符串”开始讨论,java中的字符串如何不同于C或C++,然后问关于不可变对象,并且问到的主要问题是:“为什么字符串在java中是不可变的或最终的”。p>

为什么字符串在Java中是不可变的或最终的 正如我所说的,这是java中重要的字符串访问问题,它从“什么是字符串”开始讨论,java中的字符串如何不同于C或C++,然后问关于不可变对象,并且问到的主要问题是:“为什么字符串在java中是不可变的或最终的”。p>,java,string,final,immutability,Java,String,Final,Immutability,你能分享你的想法吗 提前感谢。字符串在许多现代语言(包括Java)中不可变的两个主要原因是安全性和性能(或者更准确地说,是优化的机会) 字符串是最终的是为了确保它们的不变性(通过禁止任何人扩展它们并使它们再次可变)。这主要是出于安全原因。字符串被用作网络连接、数据库url等的参数,如果它是可变的,则很容易受到攻击 字符串的不变性解决了一些同步问题,它使字符串线程安全 支持StringPool设施 到缓存字符串的hashcode 支持类加载机制,其中字符串用作参数。字符串可变会导致加载错误的类最重

你能分享你的想法吗


提前感谢。

字符串在许多现代语言(包括Java)中不可变的两个主要原因是安全性和性能(或者更准确地说,是优化的机会)


字符串是
最终的
是为了确保它们的不变性(通过禁止任何人扩展它们并使它们再次可变)。

这主要是出于安全原因。字符串被用作网络连接、数据库url等的参数,如果它是可变的,则很容易受到攻击

字符串的不变性
解决了一些同步问题,它使
字符串
线程安全

支持StringPool设施

缓存
字符串的
hashcode


支持类加载机制,其中
字符串
用作参数。字符串可变会导致加载错误的类

最重要的原因是安全性

如果恶意线程可能获得对可变字符串的引用,那么就会出现很多安全风险,而可变字符串将被传递到一个方法中,该方法必须在执行重要操作之前验证该字符串。线程有可能在验证后更改字符串,然后使用危险字符串执行操作

字符串在Java中不可变的另一个原因是允许字符串缓存其哈希代码

如上所述,最重要的原因是安全性和线程安全性

考虑一个场景,在银行转账应用程序中,受益人账号在字符串中定义为“0789567345”。 如果错误地/故意地更改了账号,钱将进入错误的账户

另一种情况-如果有人在处理为之间的任意位置更改类名

getClass().getName().subString(0, 5);

类加载器会简单地说“找不到类”

好的和有趣的问题相关:我同意。同样与性能和优化相关的是,不可变的数据结构更容易推理,特别是在使用多线程算法时。但是Java中Java.lang.String不可变的核心原因是安全性。我知道您已经涵盖了所有要点。但对每一点的解释都是错误的fantastic@mohan拉杰:你已经提到了这些问题,你能不能对每一点多做一点解释,也许是一个实际的例子或其他什么