String s1 = new String("string");
String s2 = new String("string");
String s3 = "string";
String s4 = "string";
System.out.println(s1 == s2); //FALSE
System.out.println(s2.equals(s1)); //TRUE
System.out.println(s3 == s4); //TRUE
System.out.println(s3.equals(s4)); //TRUE
创建 s1
和 s3
有什么区别?
请告诉我
在 String 中,我们只有 String 对象,那么为什么它以不同的方式对待这两个对象。
s1 和 s2 具有不同的内存地址,而 s3 和 s4 具有相同的内存地址。
为什么它基于 new
operator.?
最佳答案
String
在 Java 源代码中表示字符串文字的对象被添加到共享 String
当定义它们的类被加载时池1。这确保了 String 文字的所有“副本”实际上是同一个对象......即使文字出现在多个类中也是如此。这就是为什么 s3 == s4
是true
.
相比之下,当你 new
一个字符串,一个不同的新字符串对象被创建。这就是为什么 s1 == s2
是false
. (这是 new
的基本属性。它保证创建并返回一个新对象......如果它正常完成。)
然而,无论哪种情况,字符串都将具有相同的字符,这就是为什么 equals
正在返回 true
.
虽然了解正在发生的事情很重要,但真正的教训是比较 Java 字符串的正确方法是使用 equals
而不是 ==
.
如果您想安排可以使用 ==
来测试您的 String 对象是否相等, 你可以使用 String.intern
“实习”他们方法。但是,您必须始终如一地这样做……而实习在各个方面都是一个昂贵的过程……所以这通常不是一个好主意。
1 - 实际上,它比那要复杂一点。它们的对象在类加载和首次使用文字之间的某个时间被添加到池中。精确的时间未指定并且依赖于 JVM 实现。然而,它保证只发生一次,并且在任何应用程序代码看到 String
之前发生。文字对应的对象引用。
关于java - 分配和创建新的字符串差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15986188/