字符串常量池实际上将缓存所有字符串文字,因此它们是下面的同一对象,这就是为什么你看到要执行输出的原因s1==s2
。本质上,这是对VM的一种优化,可以避免每次声明文字时都创建新的字符串对象,这可能会很快变得非常昂贵!在你的str1==str2
示例中,你明确地告诉VM创建新的字符串对象,因此为什么它是错误的。
顺便说一句,intern()
在任何字符串上调用该方法都会将其添加到常量池中(并返回添加到该池中的String。)但这不一定是一个好主意,但是除非你确定要处理绝对将用作常量的字符串,否则你可能最终难以跟踪内存泄漏。