最近在复习Java基础时看了Java之父“余胜军”的12.99Java全套教学视频,发现里面讲到的equals与==这个知识点讲得很好,所以有感而发记录下自己的学习心得。
==:双等号,比较两个对象的内存地址
equals:比较两个对象的值是否相等,前提条件是比较的对象重写了equals方法,若没有重写则比较的仍旧是两个对象的内存地址
我们都知道任何我们创建的Java对象都是Object超类(基类)的子类(直接或者间接继承了Object),我们创建的自定义Java类若没有重写equals方法,我们所使用的equals方法则自动继承自基类,下面我们来看看jdk8里Object基类中的equals方法的源码
public boolean equals(Object obj) {
return (this == obj);
}
从jdk8源码可以看出equals方法使用的是双等号用于比较两个对象,则在没有重写equals方法时比较的依旧是两个对象的内存地址,接下来我们用几个例子来讲解。
我们创建一个自定义学生类student
public class student {
String name;
int age;
public student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在测试类test中比较没有重写equals方法时,创建两个属性值都一样的student对象,用equals进行比较
public class test {
public static void main(String[] args) {
student student1 = new student("zhangsan", 18);
student student2=new student("zhangsan",18);
System.out.println(student1.equals(student2));
}
}
启动测试类,控制台输出打印false
这时我们重写student类中的equals方法
public boolean equals(Object o) {
// 判断内存地址是否一致
if(this==o){
return true;
}
// 判断比较的对象是否为空或者类型是否匹配
if(o==null || this.getClass() != o.getClass()){
return false;
}
// 最后比较对象属性值
student obj= (student)o;
return this.name==obj.name&&this.age==obj.age;
}
再测试一次,控制台打印true
再说说String类在使用equals比较时为什么就是直接比较字符串值,因为String已经重写了equals方法。我们在test测试类中创建两个值一样的字符串,使用equals和==分别比较这两个字符串是否相等
public class test {
public static void main(String[] args) {
String str1 = new String("HHH");
String str2= new String("HHH");
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
}
}
控制台输出结果如下,说明String类已经重写了equals方法,实现了比较字符串值的功能,而双等号依旧是比较两个对象的内存地址
接下来让我们来看看jdk8中String类中重写的equals方法源码
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;
}
想要继续深入理解重写equals方法中的具体逻辑,可以自己debug调试调试
好了,今天分享的内容就这些,如果对你有用记得给我点赞加收藏