equals和hashcode为什么要同时重写,重写equals和hashcode
equals和hashcode总结:
如何解决写爬虫IP受阻的问题?立即使用。
如果equals方法未被重写,它用于确定对象的内存地址引用是否带有地址。重写后一般用来比较对象的内容是否相等(比如student对象包含姓名和年龄,我们重写equals方法判断只要姓名和年龄相同,就认为使用了一个学生)。
HashCode是jdk根据对象的地址或字符串或数字计算的int类型值。当然,你也可以重写。hashcode方法仅在集合中使用。
当一个对象放入集合时,首先判断hashcode是否相等,然后判断equals是否相等。即使都是同一个对象,列表也可以放进去,集合不会放进去,因为不允许重复。
例如:
公共课学生{
私人年龄;
私有字符串名称;
public Student(int age,String name){
this.age=年龄;
this.name=name
}
public int getAge() {
回归年龄;
}
公共无效存储(整数){
this.age=年龄;
}
公共字符串getName() {
返回名称;
}
public void setName(字符串名){
this.name=name
}
//重写equals方法,判断姓名和年龄是否相等。
public boolean equals(Object o){
if(o==null){
返回false
}
if(this.getClass()!=o.getClass()){
返回false
}
学生学生=(学生)o;
if(name==null){
返回false
}
if(age==student . getage()name . equals(student . getname()){
返回true
}
返回false
}
公共静态void main(String[] args) {
studentOne=新学生(1, yjc );
studentTwo=新学生(1,新字符串( yjc ));
system . out . println(student one . equals(student two));
system . out . println( 1: studentone . getname()。hashCode());
system . out . println( 2: student two . getname()。hashCode());
}
//输出结果:真
1: 119666
2: 119666
}从上面可以看到,两个字符串都叫‘yjc’,不管是直接的‘yjc’还是new String(‘yjc’),它们的hashcode都是一样的。所以在重写hashcode方法时可以使用它。
例如,如果您希望姓名和年龄相同,则不仅等号相同,而且它们的hashcode也相同,您可以像这样重写hashcode:
public int hashcode(){
final int prime=31
int result=1;
结果=质数*结果年龄;
result=prime*result (name==null?0:name . hashcode());
返回结果;//直接写年龄age (name==null?0: name.hashcode())还好,但是感觉太简单了0.0
}这样,两个同名同岁的学生对象就是同一个对象,放入集合中会被认为是同一个对象。无论放置多少这样的对象,set.size()都等于1。
同样,因为HashMap键是惟一的,HashMap对象根据其键的hashCode定位存储位置,并使用equals(key)获取相应的值。所以在put的时候会判断这个键是否重复使用hashcode和equals,如果重复就会被覆盖。这就是equals和hashcode的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。