==和equals的区别
前言:这是一个老生常谈的问题了,不过一直没有认真总结过,现在打算记录一下,嘻嘻嘻~
1.比较对象
- 1.1 比较对象(未重写equals方法)
@AllArgsConstructor
public class Student {
private int age;
private String name;
public static void main(String[] args) {
Student s1 = new Student(1, "a");
Student s2 = new Student(1, "a");
Student s3 = new Student(2, "a");
System.out.println(s1.equals(s2)); //false
System.out.println(s1.equals(s3)); //false
System.out.println(s1 == s2); //false
}
}
- 1.2 比较对象(重写了equals方法)
@AllArgsConstructor
public class Student {
private int age;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
public static void main(String[] args) {
Student s1 = new Student(1, "a");
Student s2 = new Student(1, "a");
Student s3 = new Student(2, "a");
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //false
System.out.println(s1 == s2); //false
}
}
小结:比较对象:
对于equals而言,没有重写equals方法,比较的是地址值;重写了equals方法,则比较的是字面值,就是长得是不是一模一样。
对于==而言,永远都是在比较地址值。
注意:如果使用了Data注解,也会有重写equals方法的效果!!!
2.比较字符串
public class Test {
//字符串的equals大家都很清楚,长得一样就是true,有兴趣的朋友可以去看看源码
public static void main(String[] args) {
String str1 = "aaa";
String str2 = "aaa";
String str3 = new String("aaa");
System.out.println(str1 == str2); //true
System.out.println(str2 == str3); //false
}
}
小结:比较字符串:
对于equals而言,比较的是字面值,就是长得是不是一模一样。
对于==而言,永远都是在比较地址值,上面str3虽然和str2长得一样,但是是通过关键字new出来的,所以会在堆内存中创建一个指向字符串常量池的引用,两者地址值是不一样的,故false。
总结:
1:==永远都是在比较地址值;
2:equals是Object类中的一个方法,通过查看其源码,可以发现是通过 == 实现的,所以也是在比较地址值,除非对象类型重写equals方法,常伴随着重写hashcode方法。但是String类重写了equals方法,所以字符串的equals比较的是字面值。
附String类的equals方法源码,以及Object类的equals方法源码:
//String类
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
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;
}
//Object类
public boolean equals(Object obj) {
return (this == obj);
}