java等于和==混淆

java等于和==混淆,java,equals,string-comparison,comparison-operators,Java,Equals,String Comparison,Comparison Operators,可能重复: 一,。我知道==检查两个对象是否指向相同的内存位置。默认的equals定义使用==进行检查,这意味着两者都是相同的 二,。String类重写equals方法以检查两个字符串是否具有相同的值 考虑S1=试验,S2=S1 现在S1和S2是两个不同的对象,因此根据第1点S1==S2应该为false,根据第2点S1.equals2应该为true,但是当我在eclipse中运行这个小程序时,两者都返回true。字符串对象有什么特别的地方,S1==S2也是真的吗 考虑S1=试验,S2=S1;现

可能重复:

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

二,。String类重写equals方法以检查两个字符串是否具有相同的值

考虑S1=试验,S2=S1


现在S1和S2是两个不同的对象,因此根据第1点S1==S2应该为false,根据第2点S1.equals2应该为true,但是当我在eclipse中运行这个小程序时,两者都返回true。字符串对象有什么特别的地方,S1==S2也是真的吗


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

没有。这就是你的论点失败的地方

您创建了一个字符串对象,并且两个变量都引用同一个字符串对象。赋值不会生成字符串的新副本。

当您写入

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

更令人困惑的是——如果你写:

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

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

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
初始化时

S2=S1 
它们都指向相同的内存位置

试一试

这会给你

 S1==S2 //false

这可能是本论坛上提出并已回答的1个Java问题;现在S1和S2是两个不同的对象-不,它们不是。S2和S1都是对同一字符串对象的引用。初始化S2=S1时,它们都指向相同的内存位置。尝试S1=测试;S2=试验;这将为您提供S1==S2false@PeterLawrey每次被问到这个问题,都会得到很多次的回答。多么浪费时间啊;
 S1==S2 //false