字符串、常量池、StringBuilder之间的微妙关系
例子:
public static void main(String[] args) throws IOException{ String s1 = "Programming"; String s2 = new String("Programming"); String s3 = "Program"; String s4 = "ming"; String s5 = "Program" + "ming"; String s6 = s3 + s4; System.out.println(s1 == s2); //false System.out.println(s1 == s5); //true System.out.println(s1 == s6); //false System.out.println(s1 == s6.intern()); // true System.out.println(s2 == s2.intern()); // false }
为什么?
我们先看看反编译后的代码:
public static void main(String[] paramArrayOfString) throws IOException { String str1 = "Programming"; String str2 = new String("Programming"); String str3 = "Program"; String str4 = "ming"; String str5 = "Programming"; String str6 = str3 + str4; System.out.println(str1 == str2); System.out.println(str1 == str5); System.out.println(str1 == str6); System.out.println(str1 == str6.intern()); System.out.println(str2 == str2.intern()); }
在解答之前先复习一下:
1.==判断的是对象的内存地址,而equals判断的是对象内容;
2. String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
解答:
1.s1与s2内存地址不一致,故:System.out.println(s1 == s2); //false
2.从反编译的代码看出,s5是直接赋值字符串"Programming",因为"Programming"已存在常量池中,就直接使用常量池中的字符串,故:System.out.println(s1 == s5); //true
3.实际String s6=(new StringBuilder(s3)).append(s4).toString(),是一个新的String对象,故:System.out.println(s1 == s6); //false
4.s6.intern() 意思是拿到s6字符串对象在常量池中对应的版本的引用,由于常量池中已存在"Programming"并且是在初始化s1时生成的,故:System.out.println(s1 == s6.intern()); // true
5.同理,s2.intern()返回的的字符串引用同样等于s1,故: System.out.println(s2 == s2.intern()); // false
本文来自博客园,作者:咔咔皮卡丘,转载请注明原文链接:https://www.cnblogs.com/anquing/p/14565494.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库