为什么String是不可变的

为什么String是不可变的

字符串常量池

因为jvm设计了字符串常量池,将字符串缓存到字符串常量池。如果字符串是可变的,这样的缓存就变得效率低下了。

线程安全问题

如果字符串是可变的,假设有很多变量指向同一个字符串,如果这个字符串发生变化,从abc变为123,那么所有的变量指向的值发生变化,如果有线程需要读取字符串,前后读取的值不一样,这就需要对字符串采取额外措施保证是线程安全的,会导致编码工作量编码,而且字符串是特别常用的,如果每个字符串都需要考虑线程安全问题,工作量会变得很大。如果是不可变的,线程安全的问题就不会发生了。

缓存问题

string对象缓存了自身的hashcode,如果字符串可变,那么缓存的hashcode就失效了,需要重新计算hashcode,也会导致效率低,特别是在hashmap的操作中,用到了很多hashcode比较。

类加载器

类加载器使用String保存全类名。如果String可以改变,那么就可能会将HashMap的加载换成自定义类的加载,这样就有安全问题。

参考文章

posted @   xiuer211  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示