为什么String是不可变的
为什么String是不可变的
字符串常量池
因为jvm设计了字符串常量池,将字符串缓存到字符串常量池。如果字符串是可变的,这样的缓存就变得效率低下了。
线程安全问题
如果字符串是可变的,假设有很多变量指向同一个字符串,如果这个字符串发生变化,从abc变为123,那么所有的变量指向的值发生变化,如果有线程需要读取字符串,前后读取的值不一样,这就需要对字符串采取额外措施保证是线程安全的,会导致编码工作量编码,而且字符串是特别常用的,如果每个字符串都需要考虑线程安全问题,工作量会变得很大。如果是不可变的,线程安全的问题就不会发生了。
缓存问题
string对象缓存了自身的hashcode,如果字符串可变,那么缓存的hashcode就失效了,需要重新计算hashcode,也会导致效率低,特别是在hashmap的操作中,用到了很多hashcode比较。
类加载器
类加载器使用String保存全类名。如果String可以改变,那么就可能会将HashMap的加载换成自定义类的加载,这样就有安全问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix