String yesB = new String("aaa") + new String("bbb");   String yesC = yesB.intern();   String yesA = "aaabbb";  个人对前两行代码的解读不认同楼主,若有错误希望还各路大佬不吝赐教。 本论述基于JDK1.8,由于1.8之后,字符串常量池也放到了堆区,因此下面我说的常量池区和非常量池区都是在堆区里。 首先说一下new String(),会在非常量池区划一块空间存字符串值,然后若常量池内没有存该字符串,也会向常量池中存一份,但是最终返回的是非常量池中的引用。     楼主没有将字符串加法的原理展开来讲, String yesB = new String("aaa") + new String("bbb");     真正的过程是  String yesB = new StringBuilder().append("aaa").append("bbb").toString();      抛开中间new 的StringBuilder对象不讲,StringBuilder的toString方法源码:     public String toString() {         // Create a copy, don't share the array         return new String(value, 0, count);     } 因此,第一行  yesB 最终可以等效为   String yesB = new String("aaabbb");  上面已经论述了 new String(); 的过程,因此当第一行语句执行完之后, yesB的值为非常量池中"aaabbb"的地址,且常量池中必定有字符串"aaabbb"。 然后解释第二句,  yesB.intern()   效果是:第一步,如果常量池中无"aaabbb",那么会在常量池中划一块空间存"aaabbb";否则,不做操作。 第二步: 将常量池中"aaabbb"的地址给yesB,并返回给yesC。 因此执行第二句后, yesB和yesC都指向常量池中的"aaabbb" 第三行同意楼主。 最后3个字符串引用的值均为常量池中的地址。