使用intern方法时,字符串常量池中没有对应对象的字符串将返回同一对象的引用

时间:2018-09-05 07:29:18

标签: java string string-pool

在使用常量方法的字符串常量池中没有对应对象的字符串将返回堆中存在的同一对象的引用。 是否应该返回String常量池中由intern方法新创建的完全不同的对象的引用? 考虑给定的代码段。

class  Test{
public static void main(String[] args) {
    String s1 = new String("durga");
    String s2 = s1.concat("software");
    String s3 = s2.intern();
    System.out.println(s2 == s3);
    String s4 = "durgasoftware";
    System.out.println(s3 == s4);
 }
}

输入:深(主*)LanguagePackageInJava $ javac Lecture14.java
深度(主*)LanguagePackageInJava $ java测试
输出:

第一个打印语句的输出为真吗?据我说, s2 是堆区域的对象,而 s3 应该是字符串常量池区域的对象。他们俩怎么能指向同一个对象?

2 个答案:

答案 0 :(得分:1)

正如您在Java doc中所看到的:

  

返回字符串对象的规范表示。 [...]调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对该String对象的引用。

因此,实际上,它首先实习s2所引用的字符串,然后返回该引用(将其存储在s3中)。这导致s2和s3指向同一对象。

如果字符串池中已经包含字符串(通过将语句String s4 = "durgasoftware"移至方法顶部进行尝试),则将其返回,并且s2所引用的字符串为没有实习。会产生另一个结果。

答案 1 :(得分:0)

原因是s2的值用作"intern"。该对象只是被推入池中以供重用。 在下面,我希望通过首先嵌入相同的df['log'] = np.log(df['Close']) df[['Close', 'log']].plot(figsize=(14, 7), subplots=True) 字符串来获得不同的结果。

s0

通过历史记录,String s0 = "durga".concat("software").intern(); String s1 = "durga"; String s2 = s1.concat("software"); String s3 = s2.intern(); System.out.println(s2 == s3); // false System.out.println(s3 == s0); // true 的实现发生了变化。最初,字符串池位于“永久内存”中,可能会使该内存混乱。因此,由XML解析器插入的XML标签改用了自己的映射。

我希望代码确实产生false + true。