您的位置:首页 > 编程语言 > Java开发

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