楼上几位都没有说到点上啊!!
Java对于String类型的+操作进行了特殊处理,若在系统编译初期不能确定String类型的值,在进行+操作时,内部是用StringBuilder进行字符串的连接,这种字符串操作在操作之后是存储在堆中的。
对于字符串常量的相加,例如String a = "a" + "b"; 这样的字符串的值是存储在栈中的,此时会有类似缓存机制,当两个值相同的时,引用的是同一块地址空间。
楼主的之所以==比较为false,是因为比较的是堆中内存,不会相等的,可以使用s3.intern()操作将堆中的值加入到栈内的常量池内,此时就会是相等的了。