equals方法 & equals方法的重写
一、API文档中的equals方法
- public boolean equals(Object obj):比较此对象与指定对象
二、比较运算符:==
- 若"=="两边是基本数据类型,比较的是两个数的值
- 若"=="两边是引用数据类型,比较的是两个对象的内存地址
//Student.java
public class Student extends Object {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
//StudentTest.java
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student("张三", 18);
Student s2 = new Student("李四", 19);
//"=="比较的是两个对象的内存地址
boolean boo = s1==s2;
System.out.println(boo);
//基本数据类型
int i = 1;
int j = 1;
boolean boo2 = i==j;
System.out.println(boo2);
}
}
***执行结果:***
false
true
三、equals方法
- 未重写的equals方法
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student("张三", 18);
Student s2 = new Student("李四", 19);
System.out.println(s1.equals(s2)); // false
}
}
- 查看equals方法的源码
- 可以发现未重写的equals方法内部是用“==”来比较两个对象
public boolean equals(Object obj) {
return (this == obj);
}
四、String类中的equals方法
- 查看String类中equals方法的源码
- 可以发现String类中的equals方法是被重写了的
- String类中的equals方法比较的是字符串的内容
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
- 代码演示String类中的equals方法
public class StudentTest {
public static void main(String[] args) {
String str1 = "helloworld";
String str2 = "helloworld";
System.out.println(str1.equals(str2));
//通过new运算符创建出的str3和str4被存放在堆内存中
//故是两个不同的对象
String str3 = new String("helloworld");
String str4 = new String("helloworld");
System.out.println(str3.equals(str4));
}
}
***执行结果:***
true
true
五、equals方法的重写
- 重写需求:让equals方法比较Student类对象的内容
- 根据需求手动重写equals方法
//Student.java
@Override
public boolean equals(Object obj) {
//Object向下转型
Student s = (Student)obj;
//比较本对象和obj对象的成员变量的值是否一致
if(this.name.equals(s.getName()) && this.age==s.getAge()) {
return true;
}else {
return false;
}
}
//StudentTest2.java
public class StudentTest2 {
public static void main(String[] args) {
Student s1 = new Student("张三", 18);
Student s2 = new Student("李四", 19);
Student s3 = new Student("李四", 19);
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
}
}
***执行结果:***
false
true
六、eclipse自带的equals重写方法
- 一般情况下equals方法不需要手动重写
- 快捷键Shift+Alt+S → Generate hashCode() and equals()
- 在这里不需要重写hashCode()方法,故直接删除hashCode()即可
@Override
public boolean equals(Object obj) {
//比较的是两个对象的内存地址
if (this == obj)
return true;
if (obj == null)
return false;
//同一类的对象的字节码文件对象是同一个
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}