关于重写hashCode()方法

QJKT7777777 2009-03-01 04:37:37
//请看红色部分 是什么意思呢? 请大家指教 谢谢了~

package org.leegang.hrsystem.model;

import java.io.Serializable;
import java.util.Date;

public class Attend implements Serializable
{
private static final long serialVersionUID = 48L;

//代表标识属性
private Integer id;
//出勤日期
private String dutyDay;
//打卡时间
private Date punchTime;
//代表本次打卡是否为上班打卡
private boolean isCome;
//本次出勤的类型
private AttendType type;
//本次出勤关联的员工
private Employee employee;

//无参数的构造器
public Attend()
{
}
//初始化全部属性的构造器
public Attend(Integer id , String dutyDay ,
Date punchTime , boolean isCome ,
AttendType type , Employee employee)
{
this.id = id;
this.dutyDay = dutyDay;
this.punchTime = punchTime;
this.isCome = isCome;
this.type = type;
this.employee = employee;
}

//id属性的setter和getter方法
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}

//dutyDay属性的setter和getter方法
public void setDutyDay(String dutyDay)
{
this.dutyDay = dutyDay;
}
public String getDutyDay()
{
return this.dutyDay;
}

//punchTime属性的setter和getter方法
public void setPunchTime(Date punchTime)
{
this.punchTime = punchTime;
}
public Date getPunchTime()
{
return this.punchTime;
}

//isCome属性的setter和getter方法
public void setIsCome(boolean isCome)
{
this.isCome = isCome;
}
public boolean getIsCome()
{
return this.isCome;
}

//type属性的setter和getter方法
public void setType(AttendType type)
{
this.type = type;
}
public AttendType getType()
{
return this.type;
}

//employee属性的setter和getter方法
public void setEmployee(Employee employee)
{
this.employee = employee;
}
public Employee getEmployee()
{
return this.employee;
}

//根据employee、isCome、dutyDay来重写equals方法
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj != null &&
obj.getClass() == Attend.class)
{
Attend attend = (Attend)obj;
return getEmployee().equals(attend.getEmployee())
&& getDutyDay().equals(attend.getDutyDay())
&& getIsCome() == attend.getIsCome();
}
return false;
}

public int hashCode ()
{
if (getIsCome())
{
return dutyDay.hashCode() +
29 * employee.hashCode() + 1;
}
return dutyDay.hashCode() +
29 * employee.hashCode();
}



}
...全文
914 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
debug2 2009-05-22
  • 打赏
  • 举报
回复
如果一个类中没有成员属性是不是意味着不能重写hashcode()方法?如果可以应该怎么写?
li_d_s 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 QJKT7777777 的回复:]
引用 11 楼 lookupwtd 的回复:
dutyDay.hashCode() +
29 * employee.hashCode()

hashcode是表示对象的唯一
员工在什么时候是否签到
就像数据库中的复合主键一样
所以要
dutyDay.hashCode() +
29 * employee.hashCode()

+1是表示来签到


在挑属性时有什么需要注意的么? 谢谢你
[/Quote]
看来你没有了解为什么要重写hashcode方法,建议你去看看http://hi.baidu.com/lkdlhw_2000/blog/item/c28a044a7ddeab2208f7ef41.html
QJKT7777777 2009-03-11
  • 打赏
  • 举报
回复
是为了更快的检索出类的不同对象的内存地址~

理解的应该差不多了吧 呵呵

谢谢li_d_s咯~ 有Q么? 加我行么? 87547255
QJKT7777777 2009-03-10
  • 打赏
  • 举报
回复
这3个属性任意一个改变了~ 这个类的hashCode()指向的内存地址就改变了是么?

不知道我这样理解对不对~ 呃```

大家来说说 谢谢大家先
QJKT7777777 2009-03-10
  • 打赏
  • 举报
回复
而且好象那个“29” 位置的数字规定必须是质数哟? 为什么呢?
li_d_s 2009-03-10
  • 打赏
  • 举报
回复
很简单,因为它的equals方法用到了dutyDay, emplyee和isCome,这三个属性随便哪个不同都需要产生不同的hashcode,所以他根据这三个属性进行组合产生不同的hashcode而已,至于 dutyDay.hashCode() + m * employee.hashCode() + n,这里的m和n是你随便选的,无所谓,只要不超过int的范围就行
QJKT7777777 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lookupwtd 的回复:]
dutyDay.hashCode() +
29 * employee.hashCode()

hashcode是表示对象的唯一
员工在什么时候是否签到
就像数据库中的复合主键一样
所以要
dutyDay.hashCode() +
29 * employee.hashCode()

+1是表示来签到
[/Quote]

在挑属性时有什么需要注意的么? 谢谢你
lookupwtd 2009-03-10
  • 打赏
  • 举报
回复
dutyDay.hashCode() +
29 * employee.hashCode()

hashcode是表示对象的唯一
员工在什么时候是否签到
就像数据库中的复合主键一样
所以要
dutyDay.hashCode() +
29 * employee.hashCode()

+1是表示来签到
QJKT7777777 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 li_d_s 的回复:]
很简单,因为它的equals方法用到了dutyDay, emplyee和isCome,这三个属性随便哪个不同都需要产生不同的hashcode,所以他根据这三个属性进行组合产生不同的hashcode而已,至于 dutyDay.hashCode() + m * employee.hashCode() + n,这里的m和n是你随便选的,无所谓,只要不超过int的范围就行
[/Quote]

嗯 那就是说随便什么组合都行对吧 不一定是 dutyDay.hashCode() + m * employee.hashCode() + n这个组合 明白了~

但是为什么是这3个属性呢? 呵呵 再挑属性的时候有什么注意的么?

非常谢谢你~
QJKT7777777 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 li_d_s 的回复:]
数字是随便的,只是为了产生不同的hashcode而已
[/Quote]
小弟愚昧~ 那为什么getIsCome()为真的时候返回结果是dutyDay.hashCode() +
29 * employee.hashCode() + 1呢?

而不符合条件时就不需要加1呢?
li_d_s 2009-03-06
  • 打赏
  • 举报
回复
数字是随便的,只是为了产生不同的hashcode而已
liupengbart 2009-03-06
  • 打赏
  • 举报
回复
hashCode()方法表示对象在内存上的格式。 为什么要剩以29然后再+1的原因就不大清楚了。
QJKT7777777 2009-03-05
  • 打赏
  • 举报
回复
晕 还有没人帮我呀? 呃```
QJKT7777777 2009-03-04
  • 打赏
  • 举报
回复
我查了相关资料了解了为什么要用hashCode

但是为什么这里这个方法要乘以29然后加1呢? 其他的数字行么? 这个不怎么理解
haoziheyezi 2009-03-04
  • 打赏
  • 举报
回复
我也不懂
只知道用覆盖的hashCode()方法
QJKT7777777 2009-03-02
  • 打赏
  • 举报
回复
人呢? 教教我哟~
QJKT7777777 2009-03-02
  • 打赏
  • 举报
回复
晕 都没人来看看么?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧