为什么String在Java中是不可变的或最终的

时间:2013-04-12 09:30:21

标签: java string final immutability

正如我被告知这是Java中重要的字符串访问问题,它首先讨论“什么是字符串”,如何在java中的字符串与C或C ++不同,然后你被问及不可变对象,你就是问了一个主要问题:“为什么String是Java中的不可变或最终的”。

你能分享你的想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:27)

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

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

支持 StringPool 设施

缓存 hashcode

String

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

答案 1 :(得分:8)

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

字符串为final的事实是为了确保它们的不变性(禁止任何人扩展它们并使它们再次变得可变)。

答案 2 :(得分:8)

最重要的原因是安全性

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

为什么String在Java中是不可变的另一个原因是允许String缓存其哈希码

如上所述 - 最重要的原因 - 安全&线程安全性

考虑一个场景,在用于汇款的银行应用程序中 - 受益人帐号在字符串中定义为“0789567345”。 如果错误/故意这个acc。号码被更改,钱将转到错误的帐户。

另一种情况 - 如果有人在处理之间的任何地方更改了类名...

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

类加载器只会说'找不到类