new string("abc")创建1或2个对象:堆中必创建1个,常量池中若无"abc"则新增1个,否则不新增。

直接练真题、盯内存、看字节码,三步就能稳住字符串题。
盯住对象创建数量
每道题先问自己:这里到底创建了几个对象?关键看两点——是否涉及字面量、是否用了 new。
- "abc":只查常量池,池里有就复用,不新增对象
- new String("abc"):常量池检查(可能新增1个)+ 堆中新建1个 → 至少1个,通常2个
- "a" + "b":编译期优化为"ab",等价于字面量,不额外创建
- "a" + new String("b"):字面量"a"进池、"b"进池、new出1个String、拼接时StringBuilder再建1个 → 至少4个
死磕 == 和 equals 的区别
== 比的是引用地址,equals 比的是字符内容。但前提是 String 重写了 equals,所以它才可靠。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- s1 = "hello"; s2 = "hello" → s1 == s2 是 true(同在常量池)
- s1 = "hello"; s3 = new String("hello") → s1 == s3 是 false(池 vs 堆)
- 但 s1.equals(s3) 一定是 true(内容一致)
- 注意:StringBuilder.toString() 返回的新 String 对象一定在堆里,不会自动进常量池
动手反编译验证
光靠想容易错,javap -c 是最硬的证据。比如:
- 写完
String s = "a" + "b" + "c";,编译后反编译,会看到 ldc "abc" —— 说明真被优化了 - 写
String a = "a"; String s = a + "b";,反编译能看到 new StringBuilder → append → toString 流程 - 遇到含 null 的拼接(如 s1 + s2,s1/s2 为 null),实际调用的是 StringBuilder.appendNull(),把 null 变成字符 'n','u','l','l'
重点练透五类高频变形题
不是背答案,是掌握判断逻辑:
- 字面量拼接("ab"+"cd")→ 编译期优化,走常量池
- 变量参与拼接(str + "x")→ 运行期,StringBuilder 路径
- new String("x") 多次调用 → 堆中多个对象,常量池只存一份
- null 参与拼接 → 不报空指针,而是变成字符串 "null"
- final 字符串变量拼接(
final String a = "a"; String s = a + "b")→ 编译器识别为常量,仍走优化路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










