正如这篇我们何时应该在字符串常量上使用 String 的 intern 方法中所解释的那样,String 文字会自动池化,但对于使用 new 构造的对象则不会,因此使用该 intern 方法。但是即使我们使用intern方法也会创建一个新对象,那么intern方法有什么用呢?
String s = "Example";
String s1 = new String("Example"); // will create new object
String s2 = new String("Example").intern(); // this will create new object
// but as we are calling intern we will get reference of pooled string "Example"
现在
System.out.println(s == s1); // will return false
System.out.println(s == s2); // will return true
System.out.println(s1 == s2); // will return false
那么intern方法有什么用呢?
编辑
我了解实习生方法的工作原理,但我的问题是为什么会有实习生方法?因为要调用实习生方法,我们必须使用 new 创建字符串对象,这将创建字符串的新实例!
String s3 = new String("Example"); // again new object
String s4 = s3.intern();
System.out.println(s3 == s4); // will return false
因此调用实习生方法不会将 s3 指向池化字符串。intern 方法将返回对池化字符串的引用。
如果字符串还没有被池化,还调用实习生会将字符串推入池中?那么这是否意味着每次我在任何字符串上调用实习生时都会被推送到池中?