黑马程序员技术交流社区

标题: 小知识点!String s="a"+"b"+"c"内存创建了几个对象! [打印本页]

作者: SenGoo    时间: 2014-10-22 16:39
标题: 小知识点!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


作者: 取名回忆的时光    时间: 2014-10-22 18:03
好详细的,已阅!给个赞




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2