博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重写对象equals()和hashCode()
阅读量:3525 次
发布时间:2019-05-20

本文共 2115 字,大约阅读时间需要 7 分钟。

对Java而言,要识别两个对象是否为同一个对象有两种方式:

      1.内存地址识别(“= =”号识别);
      2.根据equals()、hashCode()中的定义 (默认Object类中定义的equals(Object o)方法也是按内存地址来比较的),具体代码如下:

public boolean equals(Object obj){                               return  (this==obj);                       }

在Hibernate中,如果是在同一个session中根据相同查询所得到的相同记录,则它们会拥有相同的Java识别,但当获取某一记录后关闭session,重新打开session再次获取同一记录时,相比较前后获取的两条记录,会被判断成不是相同的记录。

如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。

1.重写equals():

public boolean equals(Object obj) {        		if (this == obj) return true;   		if(obj == null) return false;		if (!(obj instanceof User)) 			return false;        		User other=(User)obj;		if(id!=other.id) {			return false;		}		if(age!=other.age) {			return false;		}		if(name != null && other.name != null) {			if(!name.equals(other.name)) {				return false;			}		}		if(gender != null && other.gender != null) {			if(!gender.equals(other.gender)) {				return false;			}		}		if(!birthday.equals(other.birthday)) {			return false;		}		return true;	}

2.重写hashCode():

public int hashCode() { 		int result;        		result = name.hashCode();        		result = 29 * result + getBirthday().hashCode();      		return result;    }

3.对象识别:

public void testObjectIndentify() {			SessionFactory sf = null;			Session session = null;			Transaction ts = null;			User u1 = null, u2 = null;			try {				sf = HibernateUtil.getSessionFactory();//SessionFactory单态模式				session = sf.getCurrentSession(); //保证每个读写线程有唯一的session实例				ts = session.beginTransaction();				u1 = (User)session.get(User.class,1);				ts.commit();			} catch (HibernateException e) {				// TODO Auto-generated catch block				e.printStackTrace();				if(ts != null) {					ts.rollback();				}			}			try {				sf = HibernateUtil.getSessionFactory();//SessionFactory单态模式				session = sf.getCurrentSession(); //保证每个读写线程有唯一的session实例				ts = session.beginTransaction();				u2 = (User)session.get(User.class,1);				ts.commit();			} catch (HibernateException e) {				// TODO Auto-generated catch block				e.printStackTrace();				if(ts != null) {					ts.rollback();				}			}			System.out.println(u1 == u2);			System.out.println(u1.equals(u2));	}

 

转载地址:http://cauhj.baihongyu.com/

你可能感兴趣的文章
[LeetCode javaScript] 804. 唯一摩尔斯密码词
查看>>
[LeetCode javaScript] 476. 数字的补数
查看>>
[LeetCode javaScript] 811. 子域名访问计数
查看>>
[LeetCode javaScript] 414. 第三大的数
查看>>
[LeetCode javaScript] 242. 有效的字母异位词
查看>>
[LeetCode javaScript] 75. 颜色分类
查看>>
[LeetCode javaScript] 179. 最大数
查看>>
[LeetCode javaScript] 56. 合并区间
查看>>
[LeetCode javaScript] 190. 颠倒二进制位
查看>>
[LeetCode javaScript] 521. 最长特殊序列 Ⅰ
查看>>
[LeetCode javaScript] 806. 写字符串需要的行数
查看>>
[LeetCode javaScript] 868. 二进制间距
查看>>
[LeetCode javaScript] 824. 山羊拉丁文
查看>>
[LeetCode javaScript] 463. 岛屿的周长
查看>>
[LeetCode javaScript] 107. 二叉树的层次遍历 II
查看>>
[LeetCode javaScript] 637. 二叉树的层平均值
查看>>
[LeetCode javaScript] 1. 两数之和
查看>>
[LeetCode javaScript] 14. 最长公共前缀
查看>>
[LeetCode javaScript] 26. 删除排序数组中的重复项
查看>>
[LeetCode javaScript] 8. 字符串转换整数 (atoi)
查看>>