这个涉及到 Java 的内存管理。Java 字符串分两种情况,静态的和非静态的。只要出现引号 "xxx" 这样的形式就是静态的。Java 出于效率考虑,把静态的字符串和基本数据类型一起放在内存栈区,而不是放在堆区。这是一个特例而已,一般 Java 对象都存在堆区的。
放在栈区的数据是唯一的,不会重复,因此可以用 == 来比较。例如 "123" == "123" 这是 true,这本质上只生成了一个对象。但是第一种情况,你的变量是不确定的,就不是静态字符串,只能被分配到堆区。堆区的对象可能会出现内容重复,就不能用 == 来判断,得用 equals 方法。
还有一种情况:new String(123) == new String(123) 这样就是 false,因为 new 出来的对象是放在堆区的。只能用 equals 来判定内容是否相同。