本文翻译自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
这是一个很老但很流行的问题,这里有几个原因String在java中被设计成immutable的。对内存、同步、数据结构等有好的理解,能更好的回答这个问题。下面我将简单的介绍这些原因:
1, String Pool的需要。
String pool(String intern pool) 是一个方法区里的特殊的存储区域。当创建一个String, 如果它已经在pool中存在,则会返回一存在String的引用,相反,怎会创建一个新的String,并返回该引用。
下面的代码将仅仅在堆中创建一个String对象。
String string1 = "abcd"; String string2 = "abcd";
如图:
如果String不是immutable的,改变String的一个引用将导致另一个引用的到错误的值
2. 允许String缓存它的hashcode
String的hashcode在JAVA中是使用非常频繁的。例如在HashMapzhong, String设计成immutable保证了hashcode总是一样的,所以hashcode可以被缓存而不用担心改变。也就是说,不需要每次在使用hashcode时都去计算一遍,这样更高效。
在String类里,代码:
private int hash;//this is used to cache hash code.
3. 安全
String广泛的作为参数被JAVA中的类使用,比如 网络连接,打开的文件等等,如果String不是immutable,一个连接或文件的改变将导致严重的安全威胁,一个方法还以为正连接到一个机器上,并其实没有。可变的String同样将导致反射的安全性问题,因为反射中的参数都是String类型的。
代码:
boolean connect(string s){ if (!isSecure(s)) { throw new SecurityException(); } //here will cause problem, if s is changed before this by using other references. causeProblem(s); }
总之:原因包括设计、效率和安全。实际上,这三点也是JAVA面试中一些“为什么”的答案。
欢迎关注微信公众号:shoshana
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)