腾讯Java基础专项面经:String不可变性、异常体系、IO流、反射与注解的坑

📅 2026/7/30 10:47:48 👁️ 阅读次数 📝 编程学习
腾讯Java基础专项面经:String不可变性、异常体系、IO流、反射与注解的坑

腾讯5级Android面经聊完(初级→架构师),进入专项系列。Java基础是每个级别都考的底层功夫。"String为什么不可变"这种题,背答案说"为了安全"就完了,真理解的会从内存模型、线程安全、hashCode缓存讲到字符串池。同一问题深度差五倍。今天8道题覆盖四大方向。

Q1:String为什么设计成不可变?

线程安全:不可变天然线程安全,多线程共享不需要同步。String是Java用得最多的类型,可变的话到处加锁性能灾难。

字符串池:相同内容的String共享一个对象("abc"全局只有一个)。不可变才能安全共享——可变的话一个线程改了其他线程全受影响。

hashCode缓存:创建时算一次hash就缓存了。作为HashMap的key性能极好,不用每次get重算。

安全性:大量API用String做参数(URL、文件路径、类名)。可变的话传入后被篡改会导致安全问题——Class.forName(className)如果className被改掉就加载恶意类。

设计哲学:值对象不可变,修改产生新对象,语义清晰。

Q2:String、StringBuilder、StringBuffer区别?什么时候用哪个?

String:不可变,每次拼接产生新对象。"a" + "b"编译器优化为StringBuilder,但循环里拼接不行——每次循环创建新对象。

StringBuilder:可变,非线程