黑马程序员技术交流社区

标题: 小知识点!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