Java bean 下 覆盖equals 和HashCode方法 的实现和作用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33599978/article/details/70833013

1.原理

有时候使用集合的时候我们希望集合里面的对象要是不一样的,但是每个对象都进行new 操作实例对象,我们在使用对象的引用去equals比较都是为false,即会导致这两个对象引用变量一直不同,但是对象的属性可以相同
如对象的引用变量s1.equals(s2) = false;但是对象的属性值相同,所以重写equals方法是达到去在使用equals的时候比较对象里面的属性值是否相同
Student s1 = new Student("zhangsna",30);
Student s2 = new Student("zhangsna",0);
这里重写了Student类的equals 和HashCode方法,达到使用equals比较的不是栈区的引用变量的地址比较,
而是堆区对象的内部属性的比较
即使用equals只有在Student对象中那么name和age相同的情况下才为true

2. 好处,在做数据的持久化操作的时候省去在判断zhangsna是否已经存在了数据库

3. 代码

 

public class Student{
	private String name;
	private int age;
	public Student(){}
	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	public int hashCode(){
		return name.hashCode()+age;
	}
	public boolean equals(Object obj){
		System.out.println(obj+"..equals方法执行.."+this);
		if(this==obj) return true;    //这个在父类Object 里的hashCode就已经比较过  ,可以省去 
		if(this.getClass()!=obj.getClass()) return false;
		Student stu = (Student)obj;
		return name.equals(stu.name)&&(age==stu.age);
	}
	public String toString(){
		return name+","+age;
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
}



/**
 * @author gress
 *   这里重写了Student类的equals 和HashCode方法,达到使用equals比较的不是栈区的引用变量的地址比较,
 *   而是堆区对象的内部属性的比较
 *   即使用equals只有在Student对象中那么name和age相同的情况下才为true
 */
public class Test   {

        public static void main(String[] args) {
            Student student = new Student(2, "name");        
            Student student1 = new Student(3, "name");
            Student student2 = new Student(2, "name");
            
            System.out.println(student==student1);
            System.out.println(student.equals(student1));
            System.out.println(student.equals(student2));
        }
}

展开阅读全文

没有更多推荐了,返回首页