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个,常量池中一个,堆中一个
<新手上路>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。