public class Test01 {
public static void main(String[] args) {
//串池中创建 Hello
String s1 = "Hello";
//串池中找到 Hello 并引用
String s2 = "Hello";
//堆内存中创建 Hello
String s3 = new String("Hello");
// s4为串池中找到 Hello 并引用,有没有在串池中创建 He 和 llo?
String s4 = "He"+"llo";
//串池中创建 Hellos
String s5 = "Hellos";
//substring方法返回一个String对象,即在堆内存中存在
String s6 = s5.substring(0,5);
//s8与s1相等,也就是说在这里substring方法并未创建新的String,而是返回了串池中的s1
String s8 = s1.substring(0,5);
//串池中找到 Hello 并引用
String s7 = "Hello";
//堆内存中创建 Hello,与s5不是相同的对象,Java的字符串共享只发生在串池中
String s9 = new String("Hello");
//s11与s1不同,证明s11并未引用串池中的Hello,而是在堆内存中重新创建String对象
String s10 = new String("He");
String s11 = s10+"llo";
//s13与s1不同,证明s13并未引用串池中的Hello,而是在堆内存中重新创建String对象
//当有一个字符串为堆内存中的字符串对象时,+运算将返回一个String对象
String s12 = new String("llo");
String s13 = "He"+s12;
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//true
System.out.println(s1 == s6);//false
System.out.println(s1 == s7);//true
System.out.println(s6 == s7);//false
System.out.println(s1 == s8);//true
System.out.println(s5 == s9);//false
System.out.println(s1 == s11);//false
System.out.println(s1 == s13);//false
}
}