Java实习生功能

时间:2017-08-09 06:26:04

标签: java string

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

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时它给出了真实但是通过te它给了我错误。谁能告诉我为什么?

3 个答案:

答案 0 :(得分:13)

嗯,你得到你输出的输出,因为javamain字符串已经在池中了 - 当你启动应用程序时,有很多其他类被加载,并且有些他们已经实现了这些字符串(在你的代码到达之前)

我也希望native - 但我猜不是,这意味着没有其他人实习。

这引起了一些关注(我没想到),所以我想我会稍微扩展一下。假设你这样做:

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

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

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

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

答案 1 :(得分:7)

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

  

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

这意味着如果池中已存在具有给定值的字符串,则返回 字符串,否则返回实际字符​​串。 由于前三个字符串不在池中,因此在添加到池中后返回实际字符​​串 - s2s11s4,因此它是相同的引用。不知何故,“main”和“java”已经在池中,而intern()正在返回该字符串而不是s33s331(假设s331.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

答案 2 :(得分:0)

  

intern()返回字符串对象的规范表示。一个   最初为空的字符串池由类私有维护   串。

     

当调用实习方法时,如果池已包含   字符串等于此字符串对象由equals(Object)确定   方法,然后返回池中的字符串。否则,这个   String对象被添加到池中以及对此String的引用   返回对象。

返回true的输出表示字符串池中存在字符串。

输出将为true,如果使用intern()

实习新创建和连接的字符串

示例:

public class InternTest{

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

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

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