12

正如这篇我们何时应该在字符串常量上使用 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 方法将返回对池化字符串的引用。

如果字符串还没有被池化,还调用实习生会将字符串推入池中?那么这是否意味着每次我在任何字符串上调用实习生时都会被推送到池中?

4

3 回答 3

12

的基本算法.intern()如下:

  1. 创建字符串的哈希集
  2. 检查您正在处理的字符串是否已经在集合中
  3. 如果是,则从集合中返回一个
  4. 否则,将此字符串添加到集合中并返回它

因此,它基本上用于查找给定字符串是否存在于池中,如果它存在,那么它将获得相同的实例,否则它会为新字符串创建新实例。

于 2013-10-15T05:17:55.967 回答
1

以下是事件的顺序:

String s = "Example";

在池中创建一个 Sting 文字

String s1 = new String("Example");

// will create new object <-- Correct, just create a new object

String s2 = new String("Example").intern();//

仅当在池中找不到字符串文字“示例”时才创建对象。在这种情况下,将重新调整 s1。

我希望你在这里看到实习生实际上给了你一个使用池中字符串的选项。而且在Java中,所有的字符串都只是对象;所以池实际上是具有精确字符序列的字符串的引用。

我记得 stackoverflow 本身有一个非常好的线程;刚刚为您找到它.. 只需检查一下,它很棒String Literal Pool 是对字符串对象的引用的集合,还是对象的集合

于 2013-10-15T05:13:42.257 回答
0

此方法返回字符串对象的规范表示。由此可见,对于任意两个字符串 a 和 t,当且仅当s.intern()==t.intern()is时is 。trues.equal (t)true

这是您的语法:--

public String intern ()
于 2013-10-15T05:43:55.737 回答