为何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
相关产品推荐
相关产品推荐

