使用String.intern()后输出不符预期,求Java代码异常原因解析
问题根源:运算符优先级的坑
嘿,你遇到的问题根本不是intern()方法的问题,而是字符串拼接运算符+的优先级远高于相等运算符==,导致你的输出语句逻辑完全偏离了预期。
咱们拆解一下你原来的代码:
比如第一行输出语句:
System.out.println("1 -> "+ str1 == str2);
Java会先执行优先级更高的+运算:把"1 -> "和str1拼接成一个全新的字符串对象(内容是"1 -> patty"),然后再拿这个新对象和str2做==比较——两个不同的对象引用当然不相等,所以最终打印出false,而不是你以为的先判断str1 == str2再拼接结果。
第二行输出语句也是一模一样的逻辑:
System.out.println("2 -> "+ str1 == str3);
先拼接得到新字符串,再和str3比较,结果自然也是false,这就是为什么你会看到两行false。
修正方案:给相等判断加括号
只要给==的判断部分加上括号,强制让它先执行,就能得到你预期的结果:
public class Test { public static void main(String[] args) { String str1 = "patty"; String str2 = new String("patty"); // 给==判断加括号,确保先执行相等比较 System.out.println("1 -> " + (str1 == str2)); String str3 = str2.intern(); System.out.println("2 -> " + (str1 == str3)); } }
再说说intern()的作用
这里顺便确认下intern()的逻辑:当你调用str2.intern()时,JVM会检查字符串常量池里是否存在"patty"这个字符串。因为str1 = "patty"已经把这个字符串存入常量池了,所以str3会直接引用常量池中的那个对象,和str1是同一个引用,因此str1 == str3会返回true。
修正后的代码运行结果就是你预期的:
1 -> false 2 -> true
内容的提问来源于stack exchange,提问作者vishal s.
相关产品推荐
相关产品推荐

