1、创建

通过字面量创建的String对象和new的String对象不同。字面量创建的对象在常量池中,new创建的对象在堆中。

    //String对象
    //直接用引号创建的String对象在pool中
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 == s2); // true  s2是从pool中直接取出"abc"对象的引用

    //new创建的String对象在heap中
    String s3 = new String("abc");
    String s4 = new String("abc");
    System.out.println(s3 == s4); // false  两个对象都在heap中,地址不同

    //heap中的对象和pool中的对象不是同一个
    System.out.println(s2 == s3); // false

2、intern()方法

官方解释:

民间解释:

当intern方法执行时,如果pool中已经存在一个和当前对象相同的字符串,就返回pool中的那个,否则,将当前对象添加到pool中并返回。

返回值:一个和当前对象相同的字符串,但保证取自具有唯一字符串的池。

    String s5 = "abc";
    String s6 = new String("abc");
    System.out.println(s6.intern() == s5); // true  s6.intern()取自pool

3、拼接

字符串直接拼接会放入常量池中,只创建一个拼接后对象。通过变量拼接,会调用StringBuilder的append方法进行拼接,返回对象为new String()。

    String s1 = "a";
    String s2 = "ab";
    String s3 = "a" + "b";
    String s4 = s1 + "b";
    System.out.println(s2 == s3); // true
    System.out.println(s2 == s4); // false
    System.out.println(s3 == s4); // false

4、问题:

下面的代码创建了几个对象:

String s = "a" + "b" + "c"; // 1个 在常量池中,编译时已经合并
String s = new String("abc"); // 2个,常量池中一个,堆中一个
<新手上路>


DeepWellice
1 声望0 粉丝