String总结

String a = “abc”;
1.判断字符串常量池有没有"abc"
没有则加进去,返回引用;有则返回引用
总共创建一个String对象:常量池中"abc"

String a = new String(“abc”);
1.判断字符串常量池有没有"abc"
没有则加进去
2.在堆中new一个String对象,value字符数组存"abc"
总共创建两个String对象:常量池中"abc",堆中"abc"

String a = new String(“abc)+ new String(“def)
1.判断字符串常量池有没有"abc”,“def”
没有则加进去
2.+重载,代码相当于
String a = new StringBuilder(new String(“abc)).append(new String(“def”)).toString()
3.先进行append得到StringBuilder,value字符数组存"abcdef”
4.然后进行toString(),相当于new String(value字符数组)
这里注意是把value字符数组当参数加进去,而不是将String字符串"abcdef"加进去,所以这里并没有往字符串常量池加"abcdef”
总共创建五个对象:常量池中"abc",“def”,堆中"abc",“def”,“abcdef”

String a = “abc”;
String b = a.intern();
System.out.println(a==b);

结果true
a.intern()判断常量池有没有字符串"abc",判断有,则直接返回"abc"的引用
所以a==b

String a = new StringBuilder(“a”).append(“bc”).toString();
String b = a.intern();
String c = “abc”;
System.out.println(b==c);
结果true
首先通过之前的方法,通过StringBuilder避免在常量池中放入"abc"的情况下创建堆中字符串"abc"
然后String b = a.intern(); 因为常量池没有字符串"abc",所以intern方法先将"abc"放入常量池,然后返回常量池"abc"的引用给b
String c = “abc”;直接获取常量池中"abc"的引用
最终判断相等

更正:
String a = new String(“abc”)+ new String(“def”);
String b = a.intern();
String c = “abcdef”;
System.out.println(c==a);

System.out.println(b==a);

System.out.println(b==c);
结果为true true true

String a = new String(“abc”)+ new String(“def”);
String c = “abcdef”;
String b = a.intern();

System.out.println(c==a);

System.out.println(b==a);

System.out.println(b==c);
结果为false false truel
以上结果说明:如果字符串常量池无"abcdef"时,调用a.intern(),会往字符串常量池存a的引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值