注:JDK1.8
在JDK1.7及以后,字符串常量池从方法区移至堆中,使用intern()方法在常量池中 新增 字符串时,如果新增的字符串已经存在,则直接返回 常量池中的字符串引用地址 或 堆中字符串的引用地址(下图中str6就是这种情况),如果不存在则在常量池创建一个新的对象,并返回中它的引用地址
创建字符串有几种形式
- str1 = “首次” ,这种会将 首次 直接加入常量池中
- str1 = new String(“首次”),这种形式将先在常量池中创建 首次(如果在常量池不存在才创建) ,然后又在堆中创建一个新的字符串对象,一共创建了2个对象
String str1 = "首次";
String str2 = "首次";
System.out.println(String.format("str1 == str2 ? %s", str2 == str1));
String str3 = new StringBuilder("首次").toString();
String str4 = str3.intern();
System.out.println(String.format("str4 == str3 ? %s", str4 == str3));
String str5 = str4 + new StringBuilder("出现").toString();
String str6= str5.intern();
System.out.println(String.format("str6 == str5 ? %s", str6 == str5));
执行结果:
str1 == str2 ? true
str4 == str3 ? false
str6 == str5 ? true