我对实习生功能有点困惑。我有以下代码:
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它给了我错误。谁能告诉我为什么?
答案 0 :(得分:13)
嗯,你得到你输出的输出,因为java
和main
字符串已经在池中了 - 当你启动应用程序时,有很多其他类被加载,并且有些他们已经实现了这些字符串(在你的代码到达之前)
我也希望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对象的引用。
这意味着如果池中已存在具有给定值的字符串,则返回 旧字符串,否则返回实际字符串。
由于前三个字符串不在池中,因此在添加到池中后返回实际字符串 - s2
,s11
和s4
,因此它是相同的引用。不知何故,“main”和“java”已经在池中,而intern()
正在返回该字符串而不是s33
或s331
(假设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
}
}