在Java中覆写hashCode()方法
即使重写了equals()方法,也无法在HashSet中使用remove()函数。

重写hashCode()方法
▪️Test54.java的内部文件
import java.util.*;
public class Test54 {
public static void main(String[] args) {
Set<Hero54> list = new HashSet<Hero54>();
Hero54 h1 = new Hero54();
h1.name = "ミナト";
list.add(h1);
System.out.println("要素数=" + list.size());
h1 = new Hero54();
h1.name = "ミナト";
list.remove(h1);
System.out.println("要素数=" + list.size());
}
}
▪️英雄54.java
import java.util.*;
public class Hero54 {
private int hp;
public String name;
public boolean equals(Object o) {
if (o == this)
return true;
if (o == null)
return false;
if (!(o instanceof Hero54))
return false;
Hero54 r = (Hero54) o;
if (!this.name.trim().equals(r.name.trim())) {
return false;
}
return true;
}
public int hashCode() {
int result = 37;
result = result * 31 + name.hashCode();
result = result * 31 + hp;
return result;
}
}
▪️Test54.java 执行结果
元素数量=1
元素数量=0
在覆写hashCode()之前
英雄54.java
import java.util.*;
public class Hero54 {
private int hp;
public String name;
public boolean equals(Object o) {
if (o == this)
return true;
if (o == null)
return false;
if (!(o instanceof Hero54))
return false;
Hero54 r = (Hero54) o;
if (!this.name.trim().equals(r.name.trim())) {
return false;
}
return true;
}
}
Test54.java 执行结果
元素数量=1
元素数量=1
HashSet 是一个具有以下特点的数据结构:
– 不允许重复元素
– 基本上没有顺序关系
hashCode()的重写示例②
▪️Test55.java覆盖了hashCode()的例子2。
import java.util.*;
public class Test55 {
public static void main(String[] args) {
Set<Cat55> cat = new HashSet<Cat55>();
Cat55 c1 = new Cat55();
c1.name = "ねこ";
Cat55 c2 = new Cat55();
c2.name = "ねこ2";
Cat55 c3 = new Cat55();
c3.name = "ねこ3";
cat.add(c1);
cat.add(c2);
cat.add(c3);
System.out.println(c1);
System.out.println(cat.size());
cat.remove(c2);
System.out.println(cat.size());
}
}
▪️Cat55.java的hashCode()方法重写示例二
public class Cat55 {
private int cp;
public String name;
public boolean equals(Object o) {
if (o == this)
return true;
if (o == null)
return false;
if (!(o instanceof Cat55))
return false;
Cat55 f = (Cat55) o;
if (!this.name.trim().equals(f.name.trim())) {
return false;
}
return true;
}
public int hashCode() {
int catResult = 13;
catResult = catResult * 31 + name.hashCode();
catResult = catResult * 31 + cp;
return catResult;
}
}
其实就是只要hashCode相同,equals返回true的对象就被视为相同的。如果hashCode不相同,equals根本不会被评估。
▪️Test55.java hashCode()方法覆盖示例2 执行结果
Cat55@bbd407
3
2
以下是一種可能的漢語翻譯:
▪️ 補充
Cat55.java 的含義是
public class Cat55 {
public int cp;
public String name;
public boolean equals(Object o) {
if (this.name == o) {
return true;
}
return false;
}
public int hashCode() {
int catResult = 13;
catResult = catResult * 31 + name.hashCode();
catResult = catResult * 31 + cp;
return catResult;
}
}
无论如何,结果都是一样的