Java 面试题:String 不可变与常量池

一、String 为什么不可变

String 内部是 final char[](Java 9 后为 byte[]),且无修改方法,因此创建后内容不可变。好处:可安全进常量池复用、可当 HashMap 的 key、线程安全。

二、常量池

字面量 "a" 进常量池复用;new String("a") 在堆新建对象(可用 intern() 入池)。所以 "a"=="a" 为 true,new String("a")=="a" 为 false。

三、拼接选型

场景 选择
单次拼接 +(编译器优化为 StringBuilder)
循环/大量拼接 StringBuilder(快,不安全)
多线程拼接 StringBuffer(synchronized)

四、equals 与 hashCode

约定:equals 相等则 hashCode 必相等(反之不要求);重写 equals 必须重写 hashCode,否则当 HashMap 的 key 会找不到。String 据此正确实现。