String是否有任何内部机制来检查String常量池中是否存在对象?

时间:2015-05-10 04:26:27

标签: java

我知道当我在下面做的时候: String s =" abc&#34 ;;

JVM检查" abc"字符串常量池上的对象,如果不存在,它将创建对象,其引用将返回到s变量。

但是在这里我想清楚一点,Do String有任何内部机制来检查这种对象的存在。

4 个答案:

答案 0 :(得分:1)

  

JVM检查" abc"字符串常量池上的对象,如果不存在,它将创建对象,其引用将返回到s变量。

错误。常量池中的任何字符串文字都是,由编译器和类加载器放在那里。

  

但是在这里我想清楚一点,Do String有任何内部机制来检查这种对象的存在。

它有外部机制:String.intern().但这与您发布的代码无关。

答案 1 :(得分:0)

您可以使用Javadoc所说的String.intern()(部分)返回字符串对象的规范表示。

String s = new String("abc").intern();

或者,

String s = "abc".intern();

答案 2 :(得分:0)

  

Do String有任何内部机制来检查这种对象是否存在。

内部......显然是的,因为否则intern()将无效。

但是此功能在intern等的JVM本机实现中,并且不在任何公共Java API中公开。

我认为String.intern()不是有效的测试。当然,如果你在一个字符串上调用intern并且该字符串对象已经在池中,那么你将获得相同的字符串对象。但是,在您的字符串对象不在池中的情况下,这并没有给出答案。在这种情况下,您无法在通话之前判断结果字符串是否在池中...或者不是。在后一种情况下,您已将一个字符串添加到池作为intern()调用的副作用

答案 3 :(得分:0)

测试上述功能的简单测试

    String one="abc";
    String two="abc";
    System.out.println(one==two);

输出

    true

这意味着变量1和2都引用相同的对象地址。