Java 重写hashCode 方法和equals方法

时间:2023-03-08 17:34:27
package Container;

import java.util.HashSet;
import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复
|---HashSet:底层数据结构是哈希表
| HashSet是如何保证元素唯一性呢?
| 是通过两个方法来完成的 hashCode 和 equals来完成的
| 如果元素的hashCode值相同,才会判断 equals 是否为true
| 如果hashCode值不相同,不会调用 equals
|
| 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的
| hashCode和equals方法
| (arrayList判断元素是否存在只依赖于equals方法)
|---TreeSet:
Set 集合的功能和 Collection 是一致的 */ class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
} public String getname()
{
return name;
} public int getage()
{
return age;
} // 重写 hashCode 方法
public int hashCode()
{
// return 1; 这种方法也能得到效果但会调用 equals 方法,并且 比较次数比较多 // 该种方法调用 String 的hashCode 方法,就不会调用 equals 方法,比较次数少
return name.hashCode()+age*39; // 保证 hashCode 值的唯一性
} public boolean equals(Object obj)
{
if (!(obj instanceof Person))
return false; Person person = (Person)obj;
return this.name.equals(person.name) && this.age == person.age;
}
} public class HashSetDemoTwo
{
public static void sop(Object obj)
{
System.out.println(obj);
} public static void main(String[] args)
{
HashSet<Person> hs = new HashSet<Person>(); hs.add(new Person("a1", 11));
hs.add(new Person("a2", 12));
hs.add(new Person("a3", 13));
hs.add(new Person("a4", 14));
hs.add(new Person("a5", 15));
hs.add(new Person("a3", 13)); System.out.println( hs.contains(new Person("a1", 11))); // 判断 a1 是否存在于集合中
sop("al:"+hs.contains(new Person("a1", 11))); // 将 a3 移除集合中
hs.remove(new Person("a3", 13)); // 遍历集合
Iterator<Person> it = hs.iterator();
while (it.hasNext())
{
Person person = (Person) it.next();
sop(person.getname()+"==="+person.getage());
}
}
}