黑马程序员技术交流社区
标题:
小知识点!String s="a"+"b"+"c"内存创建了几个对象!
[打印本页]
作者:
SenGoo
时间:
2014-10-23 11:21
标题:
小知识点!String s="a"+"b"+"c"内存创建了几个对象!
①String s =“abc” 和 String s = new String( “abc”) 的区别
String s = "abc" ;虚拟机首先会检查String池里有没有"abc"对象(通过equals 方法) ,
如果有,直接返回引用,如果没有,会在池里创建一个“abc”对象,
并返回引用。
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2); // result: true
String str = new String("abc"); 不管缓冲池是否有"abc", 都会在堆内存创建一个
"abc"对象,返回引用 ,此时,负责检查并维护缓冲池,
其实堆内存的对象是缓冲池中"abc" 对象的一个拷贝。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2); // result: false
③String s = “a” + “b” + “c” + “d” 创建了几个对象
String s = "a" + "b" + "c" + "d"; java 编译器有个合并已知量的优化功能 ,在编译
阶段就把"a" + "b" + "c" + "d" 合并为 ”abcd “
String s = "a" + "b" + "c" + "d"; // 等价于String s = "abcd";
System.out.println(s=="abcd");// result: true
④String s1 = “a” String s2 = “b” String s3 = s1 + s2;
StringBuilder sb = new StringBuidler(s1); // String 是常量,不能相加的,java 的实现方式为:
sb.append(s2);
s3 = sb.toString();
也就是说实际上 s3 是方法返回的 String 对象 ,凡是方法返回的字符串对象都是在堆内
存的。
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2; // 堆内存的对象
System.out.println(s3=="ab");// result: false
作者:
18353666072
时间:
2014-10-23 12:19
:):lol原来如此
作者:
森屿北巷
时间:
2014-10-23 13:01
收藏了。
作者:
nerveva2000
时间:
2014-10-23 13:10
这个不错,收下啦
作者:
fly_saint
时间:
2014-10-24 11:38
一如既往的详细,支持了~
作者:
刘隽哲
时间:
2014-10-24 12:41
解释的很详细 {:3_53:}
作者:
ジ旋律
时间:
2014-10-24 12:53
学习了谢谢啊
作者:
yl82846094
时间:
2014-10-24 13:13
顶一个!!!!
作者:
winkyqin
时间:
2014-10-24 16:06
学习了!
作者:
奋斗的小孩
时间:
2014-10-24 21:07
很好受教了,谢谢啦
作者:
杨佳名
时间:
2014-11-13 23:03
最近这个问题问的比较多.这个帖子很详细,浮上来大家看看
作者:
田峻菘
时间:
2014-11-13 23:26
很详细,学习了
作者:
scoto263
时间:
2014-11-14 02:00
牛人在此。过目一下
作者:
康师傅-蛋黄派
时间:
2014-11-14 09:42
总结得很好
作者:
cbb
时间:
2014-11-14 09:59
不错…加深了string的认知
作者:
高昌德
时间:
2014-11-14 10:33
学习了,,,
作者:
爱学习的小明
时间:
2014-11-14 10:58
String缓存池和堆内存到底有什么关系?
作者:
Evred
时间:
2014-11-14 11:03
学习了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2