/**首先要新建一个类,定义成员变量,通过重写
* equals()方法比较成员变量的值
*/
package july.star.equals;
/**
* 首先要新建一个类,定义成员变量,通过重写
* equals()方法比较成员变量的值
* @author MoXingJian
* @email 939697374@qq.com
* @date 2016年12月14日 下午7:04:06
* @version 1.0
*/
public class Student {
String name;
int age;
String sex;
public Student(String name, int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
//第一步分析
/*@Override
public boolean equals(Object obj) {
*//**
* 这里要改进,根据这里的比较成员变量来决定返回true还是false
* 这里其实要比较的就是name,age和sex
* 但是,name是String类型的,而String是引用类型的,所以,在这里不能直接用==比较,
* 应该用equals()比较
* this -- s1
* obj -- s2
*//*
if(obj == null){
return false;
}
//要使用的是学生类的特有成员,所以要向下转型
Student s = (Student)obj; // s -- obj -- s2
if(this.age == s.age && this.name.equals(s.name) && this.sex.equals(s.sex)){
return true;
}else{
return false;
}
}*/
//第二步优化
/* @Override
public boolean equals(Object obj) {
//为了提高效率
if(this == obj){
return true;
}
//为了提供程序的健壮性
//我先判断一下,obj是不是学生的一个对象,如果是,再做向下转型,如果不是,直接返回false
//这个时候,我们要判断的是对象是否是某个类的对象?
if (!(obj instanceof Student)) {
return false;
}
//如果是就继续
Student s = (Student)obj;
System.out.println("同一个对象,还需要向下转型比较吗?");
return this.name.equals(s.name)&&this.age==s.age&&this.sex.equals(s.sex);
}*/
//重写equals要实现hachCode()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
}
//第三步
@Override
public boolean equals(Object obj) {
if (this == obj) //判断对象地址是否相等,如果是就不用判断,提高效率
return true;
if (obj == null) //对象为空,则不往下走了
return false;
if (getClass() != obj.getClass()) //判断两个对象是否一样:class july.star.equals.Student--class july.star.equals.Student
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;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
}
//测试:
package july.star.equals;
/**
* 测试重写equals方法
* @author MoXingJian
* @email 939697374@qq.com
* @date 2016年12月14日 下午7:09:29
* @version 1.0
*/
public class Demo {
public static void main(String[] args) {
Student s1 = new Student("一菲",23,"女");
Student s2 = new Student("一菲",23,"女");
System.out.println(s1 == s2); //false 地址值不同,所以为false
Student s3 = s1; //地址引用,指向同一个地址
System.out.println( s1 == s3); //true
//false:this==obj 也是对地址的比较,所以要重写equals
System.out.println(s1.equals(s2)); //false
System.out.println(s1.equals(s3)); //true
System.out.println("--------------");
Student s4 = new Student("左莫",24,"男");
//重写后
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s1.equals(s4)); //false
Demo d = new Demo();
System.out.println(s1.equals(d)); //false 判断是否为同一个对象
}
}
equals方法重写详解
最新推荐文章于 2024-08-20 14:07:21 发布