Object类是所有Java类的根基类
Object类中equals() 方法源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
1、"==" 双等号 的作用是判断两个对象的内存地址是不是相等
即判断两个对象是不是同一个对象
(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
2、equals()方法 : 它的作用也是判断两个对象是否相等。
但它一般有两种使用情况:
1、类没有覆盖/重写equals()方法,继承自Object类,则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象(比较对象的内存地址)
2、类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)
如果是基本变量,没有equals方法,基本变量的比较方式就只有 ==
如果是变量,由于在java中所有变量定义都是一个指向,内存地址,在这里==是比较两个对象的内存地址,而不是实际内存中的内容,如果要比较实际内存中的内容,那就要用equals方法
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较内存地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的,通过上述源码
Object类中的equals方法,底层是通过 == 来进行比较,所以比较的是对象的内存地址;很多情况下,我们比较对象并不需要比较对象的地址,而是只要是同一个类的不同对象,成员属性值相同,我们就认为是同一个对象,为了达到这个效果,就必须重写equals方法,让他们比较的是类的类型和成员变量的值
我们举例如下:
创建一个People类对象
public class People {
private String name;
public People() {
}
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
//比较内容是否相等
public boolean equals(Object obj){
if (obj == null || !(obj instanceof People)) return false;
if (this == obj) return true;
People people = (People) obj;
return (this.name.equals(people.name));
}
}
我们重写其equals()方法,根据名字是否相同来判断两个对象是否相等
People people1 = new People("张三");
People people2 = new People("张三");
/**
* 未重写 equals()方法 之前,调用根类 Object的equals()方法,
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 此时 “==”双等号 比较的是内存地址是否相等,new 两个对象,内存地址不同
*
* 重写 equals()方法 之后,比较的是内容是否相等
* */
System.out.println("people1和people2是否相等:" + people1.equals(people2));//true