1.不重写hashcode的后果
类中没有重写hashcode方法,所以调用的是Object类的hashcode方法,获取对象地址值
代码展示
public class User {
/** 用户名 */
private String username;
/** 密码 */
private String password;
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 User() {}
public User(String username) {
this.username = username;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public static void main(String[] args) {
User user1 = new User("123");
User user2 = new User("123");
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
}
}
打印展示
2.重写hashcode,但是不重写equals的后果
能用hashcode找到对应索引位,但可能存在冲突,所以会调用equals判断是否相等,类中没有重写equals方法,所以调用的是Object类的equals方法,以地址值判断
代码展示
import java.util.Objects;
public class User {
/** 用户名 */
private String username;
/** 密码 */
private String password;
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 User() {}
public User(String username) {
this.username = username;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public static void main(String[] args) {
User user1 = new User("123");
User user2 = new User("123");
System.out.println("user1的hashcode值为: " + user1.hashCode());
System.out.println("user2的hashcode值为: " + user2.hashCode());
System.out.println("user1与user2是否相同: " + user1.equals(user2));
}
}
打印展示
3.重写hashcode和equals
代码展示
import java.util.Objects;
public class User {
/** 用户名 */
private String username;
/** 密码 */
private String password;
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 User() {}
public User(String username) {
this.username = username;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(username, user.username) && Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public static void main(String[] args) {
User user1 = new User("123");
User user2 = new User("123");
System.out.println("user1的hashcode值为: " + user1.hashCode());
System.out.println("user2的hashcode值为: " + user2.hashCode());
System.out.println("user1与user2是否相同: " + user1.equals(user2));
}
}