String
String存储结构改变?
有char改为byte,String再也不用char[]来存储,改为byte[]加上编码标记,节约了一些空间
String s1 = "a"; String s2 = "b"; String s3 = “ab”;
String s4 = s1+s2;
等价于StringBuilder s = new StringBuilder();
s.append("a");
s.append("b");
此时S3不等于S4,它先是通过StringBuilder的tostring方法,然后是new String()重新创建了一个对象,而s3是常量池中的,s4是堆中的。
final String s1 = "a"; final String s2 = "b"; String s3 = "ab"; String s4 = s1+s2;
用final修饰,此时s3==s4
String s1 = new String(“ab”)创建了2个对象,一个在堆中,一个在常量池中。此时s1的引用是指向堆中的,堆中的那个引用才是指向字符串常量池。
String s1 = new String(“a”) + new String(“b”)创建了6个对象。
对象1:“变量+变量”,所以创建了一个StringBuilder
对象2 3 : new String(“a”),这边创建了2个,一个堆中,一个字符串常量池
对象4 5: new String(“b”),同理创建了2个
对象6:在上面创建了StringBuilder之后,它是调用他的toString方法,创建出new String(char[a,b]),参数是字符数组,对应的构造方法不同,所以不用在字符串常量池创建ab
intern()的作用?
判断改字符是否在常量池中存在,没有则创建字符并返回该地址引用。
String a1 = new String("1") + new String("1"); a1.intern(); String a2 = "11"; System.out.println(a1 == a2);
在jdk1.6中,a1不等于a2;在jdk1.7之后,a1等于a2.
在jdk1.6之前,字符串常量池是在永久代中,不存在于堆中,当调用intern时,他会重新创造一个对象“11”,也有新的地址。
在jdk1.7及以后,字符串常量池是存放在堆中,当调用intern时,我们堆中此时已经有了对象“11”,所以字符串常量池会直接拷贝堆中“11”的地址,所以此时a1等于a2.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix