String 对象的坑,你踩过几个?

很多学 Java 的人,自认为面向对象已经入门,可一旦遇到 String s = "abc"; 和 String s = new String("abc"); 的区别,就开始含糊。再问一句:这两个操作在堆内存里分别创建了几个对象?常量池里放的是什么?拼接字符串时 + 到底做了什么?很多人答不上来。

这门课就是专门补这块缺口的。它不跟你讲泛泛的面向对象概念,而是把 String 这个最常用、也最容易被误解的类,从创建到内存布局拆开来讲。你需要搞清楚的不是“String 是不可变的”这句话,而是:不可变性在内存模型里是怎么体现的?为什么 String 设计成 final?intern() 方法在什么场景下真正有用?这些问题,才是面试和实际排查内存问题时真正会碰到的。

适合什么基础,先看哪几块

这门课适合已经写过一段 Java 代码、但还没系统梳理过 JVM 内存区域的学习者。你不需要先精通 JVM 调优,但至少要知道堆、栈、方法区各自存放什么。如果你连 == 和 equals() 的比较结果都说不准,建议先补一下基础,再来看这个专题。

资料包里的两节内容,节奏差别很大。第一节只有二十多分钟,讲的是 String 对象创建的基本流程,适合先看。如果你时间紧,可以把这一节当作主线,边看边在 IDE 里敲代码,验证 new String() 和字面量赋值分别产生多少对象。第二节超过一小时,深入内存模型和常量池细节,建议在你对第一节内容能独立画出内存图之后再看。不要一上来就啃第二节,容易越看越乱。

学完能独立做什么

学完这两节,你应该能做到:拿到一段字符串操作代码,能准确画出它在堆和常量池中的内存状态;能解释为什么 String s1 = "a" + "b"; 在编译期就确定了值,而 String s2 = new String("a") + "b"; 运行期才会创建新对象;能说清 StringBuilder 和 String 拼接在内存开销上的差异,并在实际开发中做出选择。

更重要的是,你能把 String 的内存模型当作一个样板,去理解其他引用类型对象的创建过程。以后遇到 Integer 缓存、new Object() 分配流程,心里就有了底。这比单纯背结论有用得多。

资料怎么配合练习?每看完一个知识点,先别急着往下看,动手写几个小例子:比如用 System.identityHashCode() 观察不同创建方式的地址变化;用 intern() 把运行时字符串放入常量池,再比较引用。把结果记下来,跟视频里的结论对照。最后,把两节课的笔记整理成一张“String 创建流程图”,能自己画出来,才算真正吃透了。

课程目录

1 String对象第一节 (20:31)
2 String对象第二节 (01:02:11)