为什么String类的所有写操作都返回一个新的对象?

1.为了让String类线程安全 。String类使用了不变性模式,不变性模式可以解决多线程并发问题。所谓不变性,就是对象一旦被创建,一旦被赋值,就不允许修改了;没有修改操作,也就是保持了不变性。 这样不会出现多个线程对同一个对象的读写操作而出现线程安全问题,因为这个类要么没有写方法,要么写方法返回一个新的对象;(多线程那里会详细讲解)

2.开发过程中,很多String对象都会重复使用,比如IP地址,类名,方法名等等String信息。

而且String是Java最基础的类,大量方法需要使用String类,为了提升性能,需要将String对象缓存下来。 (缓存是提升性能最重要的手段)如果缓存中有需要的String对象,则直接返回缓存的数据,如果没有则创建对象,并将新的String对象加入到缓存中。如果String的所有写方法修改的是当前值,而不是返回一个新对象,那么缓存的数据会出现丢失和重复的问题,那缓存的意义在哪里?

所以为了保证String类线程安全和缓存数据不出现问题,需要将String的写操作返回一个新的对象。

如果面试官问为什么缓存的数据会出现丢失和重复的问题? 可以这么回答。

比如:内存缓存了"a","b","c" 3个字符串,如果String的所有写方法修改的是当前值,而不是返回一个新对象。

case1: 线程1需要字符串"a",缓存有,则直接返回缓存的字符串"a"。线程2从缓存获取到字符串"a",并将字符串"a"修改成"d",那么内存现在缓存的是"b","c","d",字符串"a"丢失,但是线程1从缓存获取到的是字符串"a",需要的也是字符串"a",现在将其修改成了"d",线程1出现问题,缓存的数据出现了丢失。

case2 :方法2从缓存获取到字符串"a",并将字符串"a"修改成"c",那么内存现在缓存的是"b"、"c","c", 缓存了重复数据。

当然可以添加控制层,线程更新缓存数据的时候,1:先去判断缓存数据是否有被其他线程引用 2:更新完成后缓存数据是否会出现重复。 有引用或者重复则当前线程更新缓存失败。添加缓存的目的就是为了提升性能,控制层逻辑说不定比创建一个新对象时间花费还要多,失去了缓存的意义。

所以String的写方法返回一个新的String对象,而不是修改当前值。

全部评论

相关推荐

03-18 00:45
门头沟学院 Java
半夜翻来覆去睡不着想着瞎聊聊(大家看看乐子也算缓解缓解压力 )bg二本软工 考研下岸没实习靠着烂毕设和github偷学项目备战春招只有ssob直骗和付费上班愿意要我(be like:2000+前端)已经放弃入行代码,想着老家躺平了。1.上了个不错高中结果整天谈恋爱啥的考了个烂大学,吃不了复读的苦直接上了,来了遇到一群好兄弟整天打游戏结果人有钱的有钱,有关系的有关系,我呢...(苦笑)2.peer pressure/这一年整天看着原来高中同学、身边朋友、同学都各奔前程整的哥们整天焦虑内耗,效率极低,空耗时间。3.学技术没有恒心,没有职业规划,刚接触完java cpp后什么都不好好深入,又瞎学个rust,没整明白又想转前端,vue没学完又看上了node.js......而且大学期间给游戏搭私服、拿ai画图配音音乐、看晋书热情都比学技术高,最终学的乱七八糟什么都不精通。4.考研也其实学的囫囵吞枣,给自己要求目标院校一降再降最后报了个应该很简单的学校然后最后一段时间觉得稳了心有怠惰一志愿差十几分进面。//这一段时间整的人很自闭,和家人,朋友都接触少了 而且感觉很对不起支持自己的家人,帮助我的朋友。//去年表弟报高考志愿没劝住他学计算机(主要是哪时候没意识就业已经这样了) 他上了个普本计算机,想着怎么点一下他尽早订好目标,好好学相关技术早点实习,但转念一想他现在还是大一还是先不说了。说到这里我想起来我也有个表哥之前让我早定方向,没事可以去刷刷牛客leetcode,现在看来我那时候也听不进去,他会听得进去嘛?我觉得不好说。//不入代码的话不知道信息化、技术支持运营之类的哪种好,如果有别的可以推荐没找到就回老家摇奶茶,卖零食去了,或许可以考虑一下乡镇职位?这大学四年过的乱七八糟也得有个结束,完了也不知道未来会前往哪里,现在才懂文学文艺作品里的毕业季迷茫。我总是常常后知后觉。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务