java等于和==混淆
可能重复: 一,。我知道==检查两个对象是否指向相同的内存位置。默认的equals定义使用==进行检查,这意味着两者都是相同的 二,。String类重写equals方法以检查两个字符串是否具有相同的值 考虑S1=试验,S2=S1java等于和==混淆,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;现
现在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