You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:59