外观
一句话答案
String 用 final 类 + private final char[] 实现不可变,好处:线程安全、哈希值缓存、字符串池复用、安全性。
核心要点
实现: final类 + private final char[] + 不提供修改方法
好处: 1.线程安全 2.hashCode缓存(HashMap的key) 3.字符串常量池复用 4.安全性(不可被篡改)
追问与易错
追问方向:
- String 不可变是怎么实现的?(final 类 + private final char[] + 不提供修改方法)
- 可以通过反射修改 String 吗?(JDK8 可以,JDK9+ 模块系统限制)
- 字符串常量池在哪里?(JDK7 从方法区移到堆中)
易错点:
- ❌ "final char[] 就保证了不可变"——final 只保证引用不变,还需要不暴露修改方法
- ❌ 混淆 String.intern() 的行为——JDK7+ 不再复制字符串到常量池,而是存引用
💡 记忆锚点
String三道防线保不可变:final类不能继承、private final char[]引用锁死、不暴露修改方法。好处四连:线程天然安全、hashCode算一次缓存复用、常量池节省内存、做密钥不怕篡改。