我有以下代码:
public class Porow{
public static void main (String[] args){
String s1 = "foo";
String s2 = "foo";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
String s3 = new String ("foo");
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
}
}
输出:
true
true
false
true
我想了解并解释这里发生了什么。我需要一些指导。我是否正确地说s1和s2是存储在内存不同部分的相同对象,这就是为什么我们得到前2 true
s?
为什么第3个输出false
? s3是一个不同的对象?为什么它会在s1上使用true
方法生成equals
?我很感激一些帮助。谢谢:)。
编辑:
这个问题与==
和equals()
无关。我知道它们是什么。我的问题与内存引用和地址有关。所以不要只是假设我在询问字符串比较。我在这里问一个完全不同的事情。
答案 0 :(得分:1)
这是因为在第三种情况下,创建了一个新对象(new
关键字创建了一个新的字符串对象),==
用于对象引用相等。这就是它返回false
的原因。
equals()
方法用于String值相等,因此返回true
。
在第一种和第二种情况下,“foo”字符串文字是interned,因此,s1
和s2
都引用相同的字符串文字。
答案 1 :(得分:1)
==
运算符检查引用等价。如果两个引用是等价的,那么它们就是同一个实例。
您的第一个示例有效,因为字符串是实例化的 - 但不依赖于此。 equals()
实际检查两个字符串是否包含相同的数据。
使用new
关键字,为另一个字符串创建一个新引用 - 因此,它们不再指向同一个实例。
答案 2 :(得分:0)
因为==测试字符串引用相同的对象并且等于测试它们是否相同。你的行
String s3 = new String ("foo");
构造对常量“foo”String的新引用。再看一下What is String interning?,但请注意,实习将使用PermGen space。
答案 3 :(得分:0)
将字符串放入字符串池
当你有
时String s1 = "foo";
String s2 = "foo";
只有一个“foo”放入String池中。
所以
s1 == s2 is true becuase they reference the Same String "foo" in the pool
要回答你的问题,你的假设是正确的!
最后一个真s1.equals(s3)
比较值“foo”,这就是它们相等的原因。
所以请记住使用Strings
== compares Object reference
equals compares value.