intern方法有什么用
String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象。
JVM 中,存在一个字符串常量池,字符串的值都存放在这个池中。当调用 intern 方法时,如果字符串常量池中已经存在该字符串,那么返回池中的字符串;否则将此字符串添加到字符串常量池中,并返回字符串的引用。
实现
JDK1.6 中,常量池在方法区。JDK1.7 中,常量池移到堆区了。
JDK1.6
- 字符串常量池有该字符串,则返回字符串常量池中的引用。
- 字符串常量池没有该字符串,会拷贝字符串至字符串常量池。
JDK1.7
- 字符串常量池有该字符串,则返回字符串常量池中的引用。
- 字符串常量池没有该字符串,生成一个对该字符串的引用在字符串常量池
show code
String str1 = "java";
String str2 = "java";
System.out.println("str1==str2:" + (str1 == str2));
String str3 = new String("java");
System.out.println("str1==str3: " + (str1 == str3));
System.out.println("str1==str3.intern(): " + (str1 == str3.intern()));
System.out.println("str2==str3.intern(): " + (str2 == str3.intern()));
String str4 = new String("java");
System.out.println("str3==str4: " + (str3 == str4));
System.out.println("str3.intern()==str4.intern(): " + (str3.intern() == str4.intern()));
String str5 = new StringBuilder("String").append("intern").toString();
System.out.println("str5.intern() == str5: " + (str5.intern() == str5));
String str6 = new String(new StringBuilder("hei").append("lou").toString());
System.out.println("str6.intern() == str6: " + (str6.intern() == str6));
String str7 = new String("hei");
System.out.println("str7.intern() == str7: " + (str7.intern() == str7));
1.8与1.6输出结果:
留言