equals方法重写详解

/**首先要新建一个类,定义成员变量,通过重写
  * 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 判断是否为同一个对象
          
     }
     
     
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值