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