String常量池问题

对呀 2019-01-02 07:47:18
jdk 1.8运行以下代码,第一个是true,第二个是false ,第三个是true
String s1 = "aaa" + new String("aaa");
s1.intern();
String s2 = "aaaaaa";
System.out.println(s1 ==s2);//true

String s3 = new String("bbbbbb");
s3.intern();
String s4 = "bbbbbb";
System.out.println(s3 ==s4);//false

char[] ch = {'c','c','c','c','c','c'};
String s5 = new String(ch, 0, 6);
s5.intern();
String s6 = "cccccc";
System.out.println(s5 ==s6);//true
疑惑点:字符串按拼接和直接new的不同形式创建对象,查看第一种编译的class字节码,发现是通过StringBuilder.append实现,最后的toString,省去中间过程就类似与第三种情况,这几种情况内存是怎么变化的呢,为什么第二个是false另外两个是true
...全文
128 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_43845112 2019-01-03
  • 打赏
  • 举报
回复
String s3 = new String("bbbbbb"); 会先在常量池创建bbbbbb对象a,然后在java堆创建新的对象b,s3指向b
String s4 = "bbbbbb";会指向对象a,因此 s3不等于s4

char[] ch = {'c','c','c','c','c','c'};
String s5 = new String(ch, 0, 6);//java堆创建对象 "cccccc",标记为a,s5指向a
s5.intern();//常量池创建对象a的引用
String s6 = "cccccc";//常量池存在对象a的引起,s6也指向a,即s6与s5相等
System.out.println(s5 ==s6);//true

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧