Java 实习生函数

2022-09-04 19:32:57

我对实习生功能有点困惑。我有以下代码:

public class InternTest{

    public static void main(String args[]){
            String s1 = "ANEK";
            String s2 =  new String("ANEK");
            String s3 = s2.intern();
            System.out.println(s3 == s1); // True

            String s11 = "ANEK".concat("SINGH");
            String s22 = s11.intern();
            System.out.println(s11 == s22); // True

            String s4 = "nat".concat("ive");
            String s5 = s4.intern();
            System.out.println(s4 == s5); // True

            String s33 = "ma".concat("in");
            String s44 = s33.intern();
            System.out.println(s33 == s44); // false

            String s331 = "ja".concat("va");
            String s441 = s331.intern();
            System.out.println(s331 == s441); // false
    }
}

我的问题是关于输出的。在第三种情况下,它给了我真,但在第四和第五种情况下,它给了我假的。我能知道这些输出背后的原因是什么吗?我无法得出结论,它为java保留词或关键字提供了假,因为当我尝试使用en um时,它给出了true,但通过te它给了我false。有人能告诉我为什么吗?


答案 1

好吧,你会得到你所做的输出,因为 和 Strings 已经在池中 - 当你启动应用程序时,加载了许多其他类,其中一些已经暂存了这些字符串(在到达你的代码之前)javamain

我也会期待 - 但我想不是,这意味着没有其他人实习它。native

这引起了一些关注(我没有预料到),所以我想我会稍微扩展一下。假设您执行以下操作:

  String left = new String(new char[] { 'h', 'e', 'y' });
  String right = left.intern();
  System.out.println(left == right);

这将打印,因为“hey”之前不在字符串池中,并且是由我们的.另一方面:trueleft.intern()

 String left = new String(new char[] { 'j', 'a', 'v', 'a' });
 String right = left.intern();
 System.out.println(left == right);

打印,因为当我们调用时,“java”已经在池中了。falseleft.intern


答案 2

让我们看一下以下文档:intern()

如果池中已包含由 equals(Object) 方法确定的与此 String 对象相等的字符串,则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用。

这意味着,如果池中已有具有给定值的字符串则返回该旧字符串,否则将返回实际字符串。由于前三个字符串不在池中,因此实际的字符串 - 和在添加到池后返回,因此它是相同的引用。不知何故,“main”和“java”已经在池中,并且返回该字符串而不是or(假设是最后一次调用)。s2s11s4intern()s33s331s331.intern()

试试这个:

String tmp = "ANEKSINGH";  // so this is in the pool
String s11 = "ANEK".concat("SINGH");
String s22 = s11.intern();
System.out.println(s11 == s22); // FALSE now