复写equals方法比较连个持久层对象是否相等

在比较两个数值或者字符串的时候,我们经常用两种方法
1- 使用 ==
2- 使用equals方法
而两种方法有什么区别呢?
==是判断两个变量或实例是不是指向同一个内存空间 
equals是判断两个变量或实例所指向的内存空间的值是不是相同 
也就是说== 判断是你比较值的地址   而equals比较的是你两个数值是否相等。
public class Dongruan {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String a = new String("abc");
		String b = new String("abc");
		System.out.println(a==b);
		System.out.println(a.equals(b));
	}

}

a和b开创了两块内存空间, 而 ==  比较的时内存地址,所以a==b返回的是false
使用equals方法比较的是两个对象的值,所以返回的是true。
我们继续来比较两个持久层的对象。
在比较两个持久层对象的时候,我们就不能直接去使用equals方法了,我们需要在pojo类中去复写一下。

在myeclipse工具的pojo类中鼠标点击右键,选择source 就能看见equals方法了,点击后就会出现复写的equals方法。

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Id;
		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())
			return false;
		Person other = (Person) obj;
		if (Id != other.Id)
			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;
	}

我们这时进行简单的测试:

public class TestDemo {
	@Test
		public void selectStu(){
			
			Configuration  cig = new Configuration().configure();
			SessionFactory sessionFactory = cig.buildSessionFactory();
			 Session session = sessionFactory.openSession();
			  Transaction t = session.beginTransaction();
			 Person p = (Person) session.get(Person.class, 4);
			 Person p1 = (Person) session.get(Person.class, 5);
				  System.out.println(p.toString());
				  System.out.println(p1.toString());
				  System.out.println(p.getName()==p1.getName());
				  System.out.println(p.getName().equals(p1.getName()));
			  t.commit();
			  session.close();
			  sessionFactory.close();
		}

我们使用两组属性相同的数据进行比较


打印结果如图


使用==判断的相同属性依旧是false,因为他们的内存地址是不同的。
而经过复写后的equals方法去比较两个相同的数值,返回的是true,这就说明了复写的equals比较的是属性值,而不是地址。

我们再去详细的去看一眼工具给我们复写的equals方法和原equals方法

@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (Id != other.Id)
			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;
	}
public boolean equals(Object obj) {
        return (this == obj);
    }
你会发现,在原方法中如果不是同一个obj就会直接返回false,而复写中当两个obj不同时会继续向下判断,进而比较每一条属性,这样才实现了非同内存地址相同属性的比较功能。


猜你喜欢

转载自blog.csdn.net/fubo_1996/article/details/80409551