equals方法重写详解
生活随笔
收集整理的这篇文章主要介绍了
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;}//第一步分析/*@Overridepublic 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 -- s2if(this.age == s.age && this.name.equals(s.name) && this.sex.equals(s.sex)){return true;}else{return false;}}*///第二步优化
/* @Overridepublic 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()@Overridepublic 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;}//第三步@Overridepublic 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.Studentreturn 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 地址值不同,所以为falseStudent s3 = s1; //地址引用,指向同一个地址System.out.println( s1 == s3); //true //false:this==obj 也是对地址的比较,所以要重写equalsSystem.out.println(s1.equals(s2)); //falseSystem.out.println(s1.equals(s3)); //trueSystem.out.println("--------------");Student s4 = new Student("左莫",24,"男");//重写后System.out.println(s1.equals(s2)); //trueSystem.out.println(s1.equals(s3)); //trueSystem.out.println(s1.equals(s4)); //falseDemo d = new Demo();System.out.println(s1.equals(d)); //false 判断是否为同一个对象}}
总结
以上是生活随笔为你收集整理的equals方法重写详解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 一个对象的内存图及运行流程和3个对象的内
- 下一篇: 选择排序由浅到深详细分析和图解