equals和hashcode为什么要同时重写,重写equals和hashcode

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: