String解析
拼接
String s1 = "a"+"b"+"c"; String s2 = "abc";
System.out.println(s1 == s2); //true,编译器在编译时将s1直接优化为“abc",存储在字符串常量池中
//如果拼接符号前后出现了变量,则相当于在堆中new String();
String s3 = ”hello"+s2;//在堆内存
String s4 = "helloabc";//在字符串常量池
System.out.println(s3 == s4);//false
//当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的引用。s->堆->常量池
String s = new String("abc").intern();
System.out.println(s == s2)//false,s指向堆内存,s2指向常量池
String s5 = "hello";
String s6 = s5+s2;
System.out.println(s5 == s6);//true
String s2 = "abc";
String s3 = s2 + "a";
String s4 = "a";
String s5 = "abc" + s4;
//false,在堆内存有两个"abca"
System.out.println(s5 == s3);
//生成str会创建几个对象?阅读字节码文件可以看出
//new String("ab");执行完常量池会有一个"ab",下列代码常量池没有”ab“
String str = new String("a") + new String("b");
/*
对象1:new StringBuilder();
对象2:new String(”a“);
对象3:字符串常量池中的”a“
对象4:new String(”b“)
对象5:字符串常量池中的”b“
对象6:new String("ab"),stringBuilder 会调用一个toString()做new String("ab")操作,这时字符串常量池并没有”ab“
*/
str.intern();//str->堆<-常量池
String s = "ab";s->常量池->堆
System.out.println(str == s)://true,这时s指向常量池,而常量池记录的是"ab"堆内存的地址
String str="abc";和String str = new String("abc");的区别 - 掘金 (juejin.cn)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix