1.String s = new String("abc");//此时内存有两个对象:StringPool里"abc",堆空间:new String("abc")
String s1 = "abc";//因StringPool里已经有“abc”对象,所以不会再产生,此时内存有两个对象
String s2 = new String("abc");//堆空间会新增一个对象,此时内存有3个对象
2.System.out.println(s == s1);//==比较的是两个对象的内存地址 false
System.out.println(s == s2);//false
System.out.println(s1 == s2);//-------doc 1//false
3.//s.intern(),首先查看StringPool里是不是有一个和s内容相等的字符串,如果有,则返回StrigPool里的这个字符串
//如果没有,则将字符串S添加到StringPool里,并返回一个对S的引用
//s.intern()返回的永远是StringPool里的字符串
System.out.println(s == s.intern());//false
System.out.println(s1 == s1.intern());//true
System.out.println(s2 == s2.intern());//false---doc 2
String sItern = "ok";
System.out.println(sItern == sItern.intern());//true
4.String hello = "hello";
String hel = "hel";
String lo = "lo";
//两个字符串进行加号连接时,连接完后,首先会到StringPool里查看有没有和自己内容相等的字符串
//如果有,如果有则返回StringPool里的字符串,没有,则将自己添加进StringPool,并返回对自己引用
//StringPool(DataSegment存储空间)里永远只有一个内容相等的字符串
System.out.println(hello == "hel"+"lo");//true
//"hel"+lo,+号连接时如果其中有一个不是字面的字符串常量,则会在堆里产生一个对象
System.out.println(hello == "hel"+lo);//false
System.out.println("hel"+lo);