一、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 据此正确实现。