🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
jdk1.7以后,使用String.intern\(\)方法和之前有一些不同。如果字符串在字符串常量池中没有出现过,就会在字符串常量池中保存一个引用,指向堆中该字符串的实例。如果字符串在常量池中已经存在了,就返回常量池中的引用 ``` public static void main(String[] args) { String str1=new StringBuilder("java").append("虚拟机").toString();//执行完这行代码后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。 System.out.println(str1.intern()==str1); String str2=new String("我喜欢java"); //执行完这行代码后,常量池中会有"我喜欢java" System.out.println(str2==str2.intern()); } // output true false ``` ### 分析 str1指向的实例是在堆中,是由“java”和"虚拟机"拼接成的。执行完第一句代码后,执行完这句话后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。然后使用str1.intern()会在常量池中保存str1实例的引用,并且返回引用,因此str1.intern\(\)==str1。 而执行完String str2=new String\("我喜欢java"\);后,常量池中会有"我喜欢java",所以在使用str2.intern()返回的就是字符串常量池中的引用,而str2指向的是堆中的引用,因此str2!=str2.intern\(\)