重写equals后为什么要重写hashcode方法

简介: 重写equals后为什么要重写hashcode方法

重写equals后为什么要重写hashcode方法

1.set存储string字符串

2.只重写equals 不重写hashcode

set中存在两个一样的并没有去重

3.重写equals 也重写hashcode

set中只有一个对象

结论

Set 去重时,会先判断hashcode是否相同  再去判断equals方法是否相同

importjava.util.HashSet;

importjava.util.Objects;

importjava.util.Set;

publicclassTestEqualsAndHashCode {

   publicstaticvoidmain(String[] args) {

       //set保存string

//        Set<String> set = new HashSet();

//        set.add("zhangsan");

//        set.add("zhangsan");

//        set.add("lisi");

//        set.add("wangwu");

//        System.out.println("Set集合长度:" + set.size());

//        System.out.println();

//        set.forEach(d -> System.out.println(d));

       //set存储对象

       // 对象 1

       Userp1=newUser();

       p1.setName("zhangsan");

       p1.setAge(18);

       // 对象 2

       Userp2=newUser();

       p2.setName("zhangsan");

       p2.setAge(18);

       // 创建 Set 对象

       Set<User>set=newHashSet<User>();

       set.add(p1);

       set.add(p2);

       // 打印 Set 中的所有数据

       set.forEach(p-> {

           System.out.println(p);

       });

   }

   staticclassUser{

       privateStringname;

       privateintage;

       @Override

       publicbooleanequals(Objecto) {

           if (this==o) returntrue; // 引用相等返回 true

           // 如果等于 null,或者对象类型不同返回 false

           if (o==null||getClass() !=o.getClass()) returnfalse;

           // 强转为自定义 User 类型

           Useruser= (User) o;

           // 如果 age 和 name 都相等,就返回 true

           returnage==user.age&&

                   Objects.equals(name, user.name);

       }

       @Override

       publicinthashCode() {

           // 对比 name 和 age 是否相等

           returnObjects.hash(name, age);

       }

       publicStringgetName() {

           returnname;

       }

       publicvoidsetName(Stringname) {

           this.name=name;

       }

       publicintgetAge() {

           returnage;

       }

       publicvoidsetAge(intage) {

           this.age=age;

       }

       @Override

       publicStringtoString() {

           return"User{"+

                   "name='"+name+'\''+

                   ", age="+age+

                   '}';

       }

   }

}

目录
相关文章
|
30天前
|
存储 算法 Java
为什么要重写 hashcode 和 equals 方法
为什么要重写 hashcode 和 equals 方法
22 0
|
1月前
|
存储 Java
为什么要重写hashCode()和equals()(深入了解)
为什么要重写hashCode()和equals()(深入了解)
|
1月前
|
自然语言处理 算法 Java
为什么说重写equals时要重写hashcode
为什么说重写equals时要重写hashcode
|
3月前
|
存储 IDE Java
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
17 1
|
8月前
|
存储
为什么重写 equals 方法就必须重写 hashCode 方法?
为什么重写 equals 方法就必须重写 hashCode 方法?
60 0
|
9月前
|
存储 Java
重写equals方法
我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系
|
9月前
为什么要重写 hashcode 和 equals 方法?
为什么要重写 hashcode 和 equals 方法?
55 0
|
存储 算法 Java
(强制)要求覆写equals必须覆写hashCode(原理分析)
hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等。众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快。对象通过调用Object.hashCode()生成哈希值;由于不可避免会存在哈希值冲突 的情况,因此当hashCode相同时,还需要再调用equals进行一次值的比较;但是若hashCode不同,将直接判定Object不同,跳过equals,这加快了冲突处理效率。Object类定义中对hashCode和equals要求如下:
192 0
|
Oracle Java 关系型数据库
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。
119 0
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
|
存储 算法 搜索推荐
面试题:重写equals方法为什么通常会重写hashcode方法?
面试题:重写equals方法为什么通常会重写hashcode方法?
139 0