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个,常量池中一个,堆中一个
<新手上路>