string相等与位置相等

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)); 

//输出
真正
真正

真正

为什么所有的string在内存中的位置都不一样?

Java只能自动实习string文字 。 新的String对象(使用new关键字创build)默认不会被实现。 您可以使用String.intern()方法来实习现有的String对象。 调用intern会检查现有的String池是否有匹配的对象,如果存在则返回它,如果不匹配,则添加它。

如果你添加该行

 s3 = s3.intern(); 

在创builds3之后立即将代码添加到您的代码中,您将看到输出中的差异。

看一些更多的例子和更详细的解释 。

这当然引起了什么时候使用==以及何时使用Java中的equals方法这个非常重要的话题。 处理对象引用时,几乎总是希望使用equals 。 ==运算符比较参考值,这几乎不是你想要比较的。 了解差异有助于您决定何时使用==或equals

你显式地为s3调用new,这会给你一个新的string实例。

创buildString实际上是一个快速的过程。 试图find任何以前创build的String会慢得多。

考虑你需要做什么来使所有的String被实施。 您需要search一组以前构build的String 。 注意这必须以线程安全的方式完成,这会增加开销。 因为你不希望这个泄漏,你需要使用某种forms的(线程安全的)非强引用。

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

新的关键字总是会产生一个新的string。

更多细节在这里 。

为什么所有的string在内存中的位置都不一样?

因为它们是相同内容的不同string!

有一个名为String.intern的方法,它本质上是把所有相同的string都放到一个哈希表中(我有点说谎,但是这是一个重要的概念,而不是现实)。

 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();