java 重写 hashCode、equals
2016-12-02 22:36
363 查看
1.用户类:User
package com.github.zhangkaitao.shiro.chapter6.entity; import java.io.Serializable; public class User implements Serializable { private Long id; private String username; private String password; private String salt; private Boolean locked; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSalt() { return salt; } public void setSalt(String salt) { this.salt = salt; } public Boolean getLocked() { return locked; } public void setLocked(Boolean locked) { this.locked = locked; } @Override public int hashCode() { // hashCode 获取的是当前对象的属性 return id != null? id.hashCode() : 0; } @Override public boolean equals(Object obj) { // equals 是拿当前对象跟另外一个对象比较 // 1.判断引用 if(this == obj) return true; // 2.判断为空、类的类型不一致 if(obj == null || !(getClass() == obj.getClass())) return false; // 3.判断内容 // 3.1.判断当前对象 id 不等于空 // 3.2.判断当前的对象的 id 不等于被判断的对象id // 3.3.判断被比较的对象的id不为空 User other = (User) obj; if(id !=null ? !(id.equals(other.id)) : other.id != null ) return false; return true; } @Override public String toString() { // 重写规则:className{filed1=value1,filed=value2} return "User{" + "id=" + id + "username=" + username + "password=" + password + "salt=" + salt + "locked=" + locked + "}"; } }
2.角色类:Role
package com.github.zhangkaitao.shiro.chapter6.entity; import java.io.Serializable; public class Role implements Serializable { private Long id; private String role; private String description; private Boolean available = Boolean.FALSE; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Boolean getAvailable() { return available; } public void setAvailable(Boolean available) { this.available = available; } @Override public int hashCode() { return id != null ? id.hashCode() : 0; } @Override public boolean equals(Object obj) { // 1.判断引用 if(this == obj) return true; // 2.判断为空,类型不一致 if(obj == null || getClass() != obj.getClass()) return false; Role other = (Role) obj; // 3.判断内容 // 3.1.判断当前 id 不为空 // 3.2.判断当前 id 跟指定对象 id不一样 // 3.3.判断被比较对象 id 不为空 if(id != null ? !(id.equals(other.id)) : other.id != null) return false; return true; } @Override public String toString() { return "Role{" + "id=" + id +"," + "role=" + role +"," + "description=" + description +"," + "available=" + available + "}"; } }
3.用户角色类:
package com.github.zhangkaitao.shiro.chapter6.entity; import java.io.Serializable; public class UserRole implements Serializable { private Long userId; private Long roleId; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } @Override public int hashCode() { // 获取 userId、roleId 联合主键跟 31 乘积之后的结果 int result = userId != null ? userId.hashCode() : 0; result = 31 * result * (roleId != null ? roleId.hashCode() : 0); return result; } @Override public boolean equals(Object obj) { // 1.比较引用 if(this == obj) return true; // 2.比较null、类类型 if(obj == null || getClass() != obj.getClass()) return false; // 3.比较内容 UserRole other = (UserRole) obj; // 比较 userId、roleId if(userId != null ? !(userId.equals(other.userId)) : other.userId != null) return false; if(roleId != null ? !(roleId.equals(other.roleId)) : other.roleId != null) return false; return true; } @Override public String toString() { return "UserRole{" + "userId=" + userId + "," + "roleId=" + roleId + "}"; } }
4.总结:
4.1.hashCode() 方法重写规则:主键值要唯一标识该对象
单主键的类:只需要返回当前类的主键的 hashCode()即可,因为这一个主键就足以唯一标识该对象了;联合主键的类:需要返回所有主键的 id 的 hashCode() 值跟 31 的乘积,因为这个时候任何一个主键已经无法唯一标识该对象了,所以需要把其他的主键值一起考虑进来,才能唯一标识当前对象,使用 31 是因为它是一个特殊的数字;
4.2.equals 方法重写规则:保证所有内容一致性
单主键的类: 比较内容的时候,只需要比较主键的值即可。联合主键的类: 比较所有主键的值。
4.3.toString() 方法重写规则:
类名称{filed1=value1,filed2=value2,…}相关文章推荐
- 【转载】Java:重写equals()和hashCode()
- Java:重写equals()和hashCode()
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- Java:重写equals()和hashCode()
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- Java:重写equals()和hashCode()
- Java中重写Object类的equals方法和hashcode方法的注意事项
- Java中重写Object类的equals方法和Hashcode方法的注意事项
- Java中重写Object类的equals方法和 hashcode方法的注意事项
- 为何Java规范中建议,重写equals很有必要重写hashCode
- Java:重写equals()和hashCode()
- java重写equals和hashCode方法
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- java的object重写equals时为什么有必要重写hashcode
- Java:重写equals()和hashCode()
- Java: 重写equals()和hashCode()
- Java:重写equals()和hashCode()
- java 重写类的equals方法和hashcode方法
- java重写equals()和hashcode()
- JAVA中重写equals()方法为什么要重写hashcode()方法?