为什么使用String实习方法?

时间:2013-10-15 05:03:01

标签: java

正如本When should we use intern method of String on String constants帖子中所解释的那样,字符串文字是自动合并的,但是对于使用new构造的对象不是,因此使用了该实习方法。但即使我们使用实习方法创建一个新对象,那么实际方法的用途是什么?

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

那么实习方法的用途是什么?

修改

我理解实习方法的工作,但我的问题是为什么实习方法存在?因为调用实习方法我们必须使用new创建字符串对象,这将创建新的字符串实例!

String s3 = new String("Example"); // again new object

String s4 = s3.intern();

System.out.println(s3 == s4); // will return false

因此调用intern方法不会将s3指向池化的字符串。 intern方法将返回对池化字符串的引用。

同样如果尚未合并,则调用实习生会将字符串推入池中?那么这是否意味着每次我在任何字符串上调用实习生都会被推送到池中?

3 个答案:

答案 0 :(得分:11)

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

  1. 创建一个字符串哈希集
  2. 检查您正在处理的字符串是否已在集合
  3. 如果是,请从集合
  4. 返回
  5. 否则,将此字符串添加到集合中并将其返回
  6. 所以它基本上用于查找存在于池中的给定字符串(如果存在),然后它将获得相同的实例,否则它将为新String创建新实例。

答案 1 :(得分: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将被重新调整。

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

我记得stackoverflow本身有一个非常好的线程;刚刚找到它..只要检查一下,它真棒Is String Literal Pool a collection of references to the String Object, Or a collection of Objects

答案 2 :(得分:0)

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

这是你的语法: -

public String intern ()