string核心在于不可变性、字符串常量池和引用与内容区分:不可变性决定所有修改操作均生成新对象;字面量入常量池,new在堆创建;==比地址,equals()比内容,intern()可将堆中字符串纳入常量池。

看Java String核心面试题,关键不是背答案,而是抓住三个底层锚点:不可变性、字符串常量池、引用与内容的区分逻辑。只要这三点理清楚,90%的String题都能自己推出来。
盯住“不可变性”这个根
String对象一旦创建,内容就固定了——不是“不能改”,而是“改不了原对象”。所有看似修改的操作(+、substring()、replace()等)实际都返回一个新对象。
- 内存里旧对象还在,只是没人再引用它;新对象在堆或常量池中另起炉灶
- 正因为不可变,才能放心放进常量池复用,也才能天然线程安全
- 面试问“String s = “abc”; s += “def”; 创建几个对象?”,答案取决于上下文,但思路一定是:原“abc”没动,“abcdef”是新对象
分清“==”和“equals()”的真实含义
==永远只比地址,equals()在String里被重写成比内容——但前提是调用的是String自己的equals,不是Object默认的。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 字面量赋值(String a = “x”; String b = “x”;)→ a == b 为true(同在常量池)
- new出来的(String c = new String(“x”);)→ a == c 为false(堆 vs 常量池)
- 但a.equals(c)一定为true,只要字符序列相同
- 注意null安全:s.equals(“abc”)可能空指针,推荐“abc”.equals(s)
搞懂字符串常量池在哪、怎么进、怎么用
常量池是方法区(JDK 7+移到堆)里的一个特殊区域,专门存编译期确定的字符串字面量。它不自动收纳运行时拼接或new出来的字符串。
- 直接写“abc”、“a”+“b”+“c”(全字面量)→ 编译期优化,进常量池
- “a” + str(含变量)→ 运行时拼接,结果在堆,除非显式调用intern()
- intern()的作用:如果池里已有相同内容,返回池中引用;否则把当前字符串放入池并返回其引用
- 面试常考:new String(“abc”).intern() == “abc” → true(因为intern后指向常量池中的“abc”)
对比String、StringBuilder、StringBuffer时不只记结论
别只背“String不可变、StringBuffer线程安全、StringBuilder快”,要理解为什么:
- String不可变 → 每次拼接都新建对象 → 频繁操作性能差
- StringBuilder用普通数组+扩容机制,无锁 → 单线程场景最优
- StringBuffer方法加synchronized → 多线程安全但有同步开销
- 三者底层都是基于char[](JDK 8-)或byte[](JDK 9+),只是封装策略不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










