equals方法重写详解

来源:互联网 发布:不用网络的赛车游戏 编辑:程序博客网 时间:2024/05/17 04:50
/**首先要新建一个类,定义成员变量,通过重写  * 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 0
原创粉丝点击