== 和 equals 的区别 :
-
==
是运算符,如果是基本数据类型,则比较的是其存储的值是否相等;如果是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。 -
equals的作用是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较所指向对象的地址值是否相同 ,等价于“==”。
1、 equals是Object的方法,本质上相当于==
,比较的是引用类型的变量所指向的对象的地址值是否相等,不能用于比较基本数据类型,源码如下:
public boolean equals(Object obj) {
// 实际上返回的就是使用==进行比较的结果
return (this == obj);
}
2、所有的类都继承Object,equals是Object对象中的非final方法,目的就是被用来覆盖(override)的,所以当我们使用equal()方法进行比较的时候,需要关注的就是这个类有没有重写Object中的equals()方法,一般情况下,类都会重写equals方法用来比较两个对象的内容是否相等。比如String类,Integer类中的equals()是被重写了,比较的是对象的值。String类的equals()方法如下:
public boolean equals(Object anObject) {
// 先使用==比较两个String对象的地址值是否相同,如果地址值相同,直接返回true
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
// 比较两个String对象的内容是否相同
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
3、自定义一个Person类,没有重写Object类的equals()方法 :
public class Person {
String name;
int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("张三",18);
Person person2 = new Person("张三",18);
System.out.println(person1.equals(person2)); // false
}
}
4、自定义一个Person类,重写Object类的equals()方法 :
public class Person {
String name;
int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
// 先使用==比较地址值是否相同,如果相同说明是同一个对象,直接返回true
if (this == o) {
return true;
}
if(o instanceof Person){
Person person = (Person) o;
return name.equals(person.name) && age==person.age;
}
return false;
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("张三",18);
Person person2 = new Person("张三",18);
System.out.println(person1.equals(person2)); // true
}
}