共计 938 个字符,预计需要花费 3 分钟才能阅读完成。
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 个,常量池中一个,堆中一个
< 新手上路 >
正文完