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

为何String.toLowerCase()返回的字符串未被intern?兼析相关代码行为

Why does toLowerCase() return a new String instance (and not an interned one)?

你这个问题问到点子上了——很多Java开发者都会误以为字符串大小写转换方法会自动intern结果,但实际上并非如此。咱们一步步拆解你的疑问:

核心结论

String.toLowerCase()(以及toUpperCase())默认会返回一个新的String实例,不会自动将转换后的字符串放入字符串常量池(String Pool)。只有当转换后的内容和原字符串完全一致时,方法才会返回原引用(避免不必要的对象创建)。

分析你的代码示例

来看你写的这段代码:

String party1 = "party"; 
String party2= "PARTY".toLowerCase(); 
if(party1==party2){ 
    System.out.println("EQUAL"); 
}else{ 
    System.out.println("NOT EQUAL"); 
}
  • party1 = "party":这里的字符串字面量"party"会被JVM自动加入字符串常量池,party1指向的是常量池中的这个唯一实例。
  • party2 = "PARTY".toLowerCase():调用toLowerCase()时,JVM需要将大写的"PARTY"转换为小写,这个过程会在堆内存中创建一个全新的String对象来存储"party",这个新对象不会自动被intern到常量池。

所以party1指向常量池实例,party2指向堆上的新实例,用==比较引用地址自然会返回false,输出NOT EQUAL。

例外情况:转换后内容无变化

如果原字符串已经是目标大小写,toLowerCase()/toUpperCase()会直接返回原引用,不会创建新对象。比如:

String s1 = "party";
String s2 = s1.toLowerCase();
System.out.println(s1 == s2); // 输出 true

这种情况下,因为转换前后字符串内容完全一致,方法会优化返回原对象,避免冗余创建。

如何让转换后的字符串被intern?

如果你希望转换后的字符串进入常量池,可以手动调用intern()方法:

String party1 = "party";
String party2 = "PARTY".toLowerCase().intern();
System.out.println(party1 == party2); // 此时输出 true

intern()方法会检查常量池中是否存在相同内容的字符串,如果存在就返回常量池中的引用;如果不存在,就将当前字符串加入常量池并返回其引用。

内容的提问来源于stack exchange,提问作者mounaim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:39:27