java等于和==混乱

时间:2012-12-03 10:41:13

标签: java equals string-comparison comparison-operators

  

可能重复:
  what is String pool in java?

1。我知道 == 会检查两个对象是否指向相同的内存位置,等于的默认定义是否使用 == 进行检查,意味着两者都相同。

2。 字符串类会覆盖equals方法,以检查两个字符串是否具有相同的值。

考虑S1 =“测试”,S2 = S1;

现在S1和S2是两个不同的对象,因此每点1 S1 == S2 应该 false 并且按照点2 S1.equals(S2) )应该是 true 但是当我在eclipse中运行这个小程序时都返回true。对于字符串对象有什么特别之处,S1 == S2也是如此。

4 个答案:

答案 0 :(得分:3)

  

考虑S1 =“测试”,S2 = S1;现在S1和S2是两个不同的对象

不。这是你的论证失败的地方。

您创建了一个字符串对象,并且您的两个变量都引用了相同的字符串对象。分配制作字符串的新副本。

答案 1 :(得分:3)

写作时

s1 = s2;

s1s2是对同一对象的引用,因此s1 == s2将始终返回true。

更令人困惑 - 如果你写:

s1 = "test";
s2 = "test";
s3 = new String("test");

您会发现s1 == s2为真,但s1 == s3为假。更详细地解释了这一点in this post

答案 2 :(得分:2)

Wiritng S1 = S2导致他们指向同一个对象

书写

String S1 = "test"
String S2 = "test"

将产生与您现在相同的结果。 这是由于编译器优化,编译器注意到不可变的字符串类,因此他将优化代码以使用相同的实例。您可以通过使用构造函数

来强制他创建新的字符串
String s1  = new String("test");
String s2  = new String("test");
System.out.println(s1 == s2) // false
System.out.println(s1.equals(s2)) //true

答案 3 :(得分:1)

初始化时

S2=S1 

它们都指向相同的内存位置。

尝试

S1 = "test"; 
S2 = "test";

这会给你

 S1==S2 //false