1 package test; 2 3 public class StringTest { 4 5 public static void main(String[] args) { 6 7 /** 8 * 创建过程: 9 * 1.检查StringPool(字符串池)里是否有"aaa"对象,这里没有,创建StringPool的字符串对象"aaa" 10 * 2.在jvm堆里创建字符串对象"aaa" 11 * 所以,这里创建了2个对象 12 */ 13 String s = new String("aaa"); 14 15 /** 16 * 创建过程: 17 * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建 18 * 所以,这里并没有创建对象 19 */ 20 String s2 = "aaa"; 21 22 /** 23 * 创建过程: 24 * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建 25 * 2.在jvm堆里创建字符串对象"aaa" 26 * 所以,这里创建了1个对象 27 */ 28 String s3 = new String("aaa"); 29 30 /** 31 * intern方法的作用:返回调用对象的字符串池里的字符串对象的引用 32 */ 33 String s4 = s.intern(); 34 35 String hello = "hello"; 36 String hel = "hel"; 37 String lo = "lo"; 38 39 /** 40 * 打印true 41 * 如果右边计算不涉及变量计算,全部都是常量,不会产生新的对象 42 * 所以返回的是字符串池里的对象引用 43 */ 44 System.out.println(hello == "hel" + "lo"); 45 /** 46 * 打印false 47 * 右边计算涉及变量计算,有对象操作,会产生一个新的对象 48 * 所以返回的是堆的对象引用 49 */ 50 System.out.println(hello == "hel" + lo); 51 } 52 53 }