结论:
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!**
不信看Object中equals的源码!

可以看出,Object中的equals的底层还是调用==来实现的。
1:先看没重写equals方法的类
class MyClass {
private String id;
private String name;
private String sex;
public MyClass(String id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
}
public class OOMTest {
public static void main(String[] args) {
MyClass c1=new MyClass("1","a","男");
MyClass c2=new MyClass("2","b","女");
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
//结果
false
false
}
双=:
由于对象时new出来的 ,所以c1和c2在堆上是完全不同的两块空间,所以双=比较肯定是false。
equals:
由于Myclass类并没有重写equals方法,所以他底层调用的时候,还是用的==
比较的还是内存地址。
2:再看下重写equals的String类
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
String s5 = new String("def");
//==
System.out.println("s1==s2:" + (s1 == s2));
System.out.println("s1==s3:" + (s1 == s3));
System.out.println("s3==s4:" + (s3 == s4));
//equals
System.out.println("--------------------");
System.out.println("s1.equals(s2):" + (s1.equals(s2)));
System.out.println("s1.equals(s3):" + (s1.equals(s3)));
System.out.println("s1.equals(s5):" + (s1.equals(s5)));
//结果
s1==s2:true
s1==s3:false
s3==s4:false
--------------------
s1.equals(s2):true
s1.equals(s3):true
s1.equals(s5):false
}
由于String类是重写了 equals方法的 所以:equals比较的是内容
为什么s1等于s2呢
(可能大家在这里比较好奇哈)?
我们声明的对象String s1=“abc”; 是存放在常量池中 ,当我们在创建String s2=“abc”;的时候它会先去常量池中查找是否存在"abc"这个对象,如果存在就会让s2直接指向该对象而不会再去创建该对象。所以得出结果s1、s2 使用 equals、== 比较结果都为true。
但是本质上是不一样的 ,前者是内存地址相同,后者是内容相同哈!
再磨叽一遍!
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!**
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!**
本文详细解析了Java中==与equals的区别,说明了在不同情况下的行为:==用于比较对象的内存地址,而equals在被重写后可以用于比较对象的内容。通过具体的代码示例展示了未重写equals方法时其默认行为与String类重写equals方法后的行为差异。
50万+

被折叠的 条评论
为什么被折叠?



