为什么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对象,而不是修改当前值。

全部评论

相关推荐

1个小白:可以考虑投一下字节
点赞 评论 收藏
分享
03-04 19:02
云南大学 Java
Yki_:没挂,只是没人捞,该干啥干啥,等着就好了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务