== 的作用是比较内存地址的
equals是比较内容的
但是,equals本质上还是比较内存地址的,那如何让equals比较内容或则用来比较对象呢?这个时候就需要重写equals方法
这是equals的源码,
public boolean equals(Object anObject) {
//-------判断传递的参数(str3)与当前对象是否同一个内存地址(str1)
if (this == anObject) {
return true;
}
// ------判断传递的参数(str3)是否为String类型
if (anObject instanceof String) {
//-------把传递进来的参数(str3)强制转换为String类型的数据
//-------才可以调用String类型的属性和方法
String anotherString = (String)anObject;
//-------value是当前对象(str1)存储字符的数组,value.length是当前对象(str1)字符数组的长度
//-------n为当前对象(str1)存储字符的数组长度
//-------anotherString.value.length是指传递进来的参数(str3)强转为String类型后的数据的字符数组的长度
//-------判断当前对象(str1)与传递进来的参数(str3)他们的字符数组长度是否相等
if (n == anotherString.value.length) {
//-------v1[]为当前对象(str1)的字符数组
char v1[] = value;
//-------v2为传递进来的参数(str3)的字符数组
char v2[] = anotherString.value;
int i = 0;
}
return true;
}
}
return false;
}
可以看出
if(this == obj){
return true;
}
是比较内存地址的,当内存地址不一样的时候,就开始比较内存里面的内容和内容的长度
当 内容和长度一样时,则比较结果时true。
下面贴两段代码,一个重写了equals,一个没重写equals;
这个是没重写的
package objectClass.other;
import objectClass.entity.Student;
public class Text {
public static void main(String[] args) {
Student student1=new Student("小强",18);
Student student2=new Student("小强",18);
System.out.println(student1.equals(student2));
System.out.println(student1.toString());
System.out.println(student2.toString());
}
}
运行结果
false
Student{name='小强', age=18}
Student{name='小强', age=18}
虽然对象里面的内容一样,但是比较结果是false;
这个是重写了equals方法的代码
public boolean equals(Object obj) {
//1.判断是否同一个内存地址
if (this == obj) {
return true;
}
if (obj instanceof Student) {
//强转
Student stu = (Student) obj;
//比较长度
if (stu.getName().length() != this.getName().length()) {
return false;
}
//比较内容
if (!stu.getName().equals(this.getName())) {
return false;
}
if (age != stu.age) {
return false;
}
return true;
}
return false;
}
运行结果:
true
Student{name='小强', age=18}
Student{name='小强', age=18}
运行结果为true;