字符串相等与位置相等

时间:2009-02-27 12:46:39

标签: java string equality

String s1 = "BloodParrot is the man";  
String s2 = "BloodParrot is the man";  
String s3 = new String("BloodParrot is the man");  

System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

//输出
真正
真正

真的

如果所有三个字符串都具有相同的内容,为什么不是所有字符串都在内存中具有相同的位置?

6 个答案:

答案 0 :(得分:15)

Java只会自动实现String 文字。默认情况下,不会禁用新的String对象(使用new关键字创建)。您可以使用String.intern()方法实现现有的String对象。调用intern将检查匹配对象的现有String池,如果存在则返回它,如果没有匹配则添加它。

如果添加行

s3 = s3.intern();
创建s3后立即

到您的代码,您会看到输出的差异。

See some more examples and a more detailed explanation

这当然提出了何时使用==以及何时在Java中使用equals方法这一非常重要的主题。在处理对象引用时,您几乎总是希望使用equals。 ==运算符比较参考值,几乎绝不是你要比较的意思。了解差异有助于您确定何时使用==或equals

答案 1 :(得分:3)

你明确地为s3调用new,这将为你留下一个新的字符串实例。

答案 2 :(得分:2)

创建String实际上是一个快速的过程。试图找到以前创建的任何String都会慢得多。

考虑您需要做什么才能使所有String被拘禁。您需要搜索所有先前构造的String的集合。请注意,这必须以线程安全的方式完成,这会增加开销。因为您不希望泄漏,所以您需要使用某种形式的(线程安全的)非强引用。

当然,你不能像这样实现Java,因为不幸的是,库会公开String和大多数其他不可变值对象的构造函数。

答案 3 :(得分:1)

new关键字总是会生成一个新字符串。

More detail here

答案 4 :(得分:1)

  

如果所有三个字符串都具有相同的内容,为什么所有字符串都没有在内存中相同的位置?

因为它们具有相同内容的不同字符串!

答案 5 :(得分:1)

有一个名为String.intern的方法,基本上,它将所有相同的字符串放入一个哈希表中(我有点撒谎,但为此,这个概念很重要,而不是现实) 。

String s1 = "BloodParrot is the man";  
String s2 = "BloodParrot is the man";  
String s3 = new String("BloodParrot is the man").intern();  

System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

应该让它们都是“真实的”。这是因为(我在这里再说一点,但它仍然只对概念而言不重要)String s1 =“BloodParrot就是男人”;完成像String s1 =“BloodParrot是男人”.intern();