当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-String 为什么要设计为不可变类?

金三银四精选java面试题-String 为什么要设计为不可变类?

来源:图灵教育
时间:2023-11-28 10:29:16
 

string 为什么要设计为不可变类?

不可变怎么理解?

@Test
public void stringDemo() {
    String str = "baili";
    str = "BAILI";
}

String值储存在常量池中。将字符串"baili",如果改变值成"BAILI",不是在原内存地址上修改数据,而是在常量池中查找或生成这个新值,再把引用指向新值的地址。如下图:

为什么不可变?

  • String 类本身是final的,不可以被继承。
  • String类内部通过private final char value[]实现,从而保证了引用的不可变和对外的不可见。
  • String内部通过良好的封装,不去改变value数组的值。

为什么要设计成不可变?

  • 字符串池优化:不可变性允许字符串共享和重用,节省内存空间和提高性能。
  • 线程安全性:不可变类天然具备线程安全的特性,无需额外同步措施。
  • 缓存哈希值:不可变性使得字符串的哈希值可以被缓存,提高相关数据结构的性能。
  • 安全性和可靠性:不可变性确保实例状态不会被修改,适用于处理敏感信息等安全场景。
  • 方便共享和重用:不可变类的实例可以自由共享和重用,提升性能效率。

TIPS

可以用反射来改变String中value的值,所以严格意义上说不一定不可变。