自定义对象重写hashCode和equals
程序员文章站
2024-03-22 17:42:10
...
自定义对象重写hashCode和equals
/*
* HashSet集合的自身特点:
* 底层数据结构,哈希表
* 存储,取出都比较快
* 线程不安全,运行速度快
*/
public class HashSetDemo1 {
public static void main(String[] args) {
//将Person对象中的姓名,年龄,相同数据,看作同一个对象
//判断对象是否重复,依赖对象自己的方法 hashCode,equals
HashSet<Person> setPerson = new HashSet<Person>();
setPerson.add(new Person("a",11));
setPerson.add(new Person("b",10));
setPerson.add(new Person("b",10));
setPerson.add(new Person("c",25));
setPerson.add(new Person("d",19));
setPerson.add(new Person("e",17));
System.out.println(setPerson);
}
}
public class Person {
private String name;
private int age;
/*
* 没有做重写父类,每次运行结果都是不同整数
* 如果子类重写父类的方法,哈希值,自定义的
* 存储到HashSet集合的依据
*
* 尽可能让不同的属性值产生不同的哈希值,这样就不用再调用equals方法去比较属性
*
*/
public int hashCode(){
return name.hashCode()+age*55;
}
//方法equals重写父类,保证和父类相同
//public boolean equals(Object obj){}
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(obj instanceof Person){
Person p = (Person)obj;
return name.equals(p.name) && age==p.age;
}
return false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(){}
public String toString(){
return name+".."+age;
}
}
推荐阅读
-
为什么重写equals方法时也要重写hashCode方法
-
转载:对几个通用的Java hashCode重写方案的一些思考和探讨
-
重写 equals() 和 hashcode()
-
为什么重写 equals() 要重写 hashCode()? hashCode 值相等,两个对象不一定相等?
-
为什么重写EQUALS时必须重写HASHCODE方法
-
自定义对象重写hashCode和equals
-
为什么重写equals方法时必须重写hashcode方法
-
Object:所有类的超类--equals() & hashCode()、== 和 equals.() 两者均可用于比较两个对象是否相等
-
说说hashCode()和equals()的相关问题
-
为什么重写equals方法时,必须重写hashcode方法