zoukankan      html  css  js  c++  java
  • hashCode()和equals()终于傻傻可以分清楚了

    一.hashCode()和equals()作用

    1.hashCode()和equals()都是Obiect类中的方法

    先看看Object类中这两个方法的定义:

    Object 的 hashCode 方法是本地方法,也就是用 c 或 c++ 实现的,该方法直接返回对象的内存地址
    Object 的 equals 方法是用 == 去比较两个对象的地址值是否相等

    但实际应用中,我们一般比较两个对象是否相等,是通过这两个对象的成员属性来判断的.故需要去重写这两个方法:

    如果类中不重写此方法:
    hashCode(): 返回的是对象的地址值
    equals(): 比较两个对象的地址值是否相等
    
    如果类中重写此方法:
    hashCode(): 返回的是根据对象的成员变量,计算出的一个整数值
    equals(): 比较两个对象的成员信息是否相同

    2.类中重写hashCode()和equals()来比较两个对象是否相等

    equals()比较是相等的,那么hashCode()肯定相等,也就是equals()是绝对可靠的;
    hashCode()比较是相等的,那么equals()不一定相等,也就是hashCode()不是绝对可靠的;

    3.既然equals()比较是绝对可靠的,为啥还要重写hashCode()呢

    对于一个有大量成员信息的对象来说,通过equals()去比较的话效率是很低的
    所以,一般是通过hashCode()和equals()搭配使用来提高效率: 先用hashCode()比较,如果不同则两个对象一定不相等; 如果相同则再通过equals()进行比较

    ==>HashSet集合能保证元素的唯一性,底层正是通过
    hashCode()和equals()来实现的

    二.HashSet集合元素唯一性原理

    其添加元素的add()方法再执行过程中,是进行了元素的判断的,这个判断流程是:

    1.先比较元素的哈希值是否相同,这个哈希值就是通过元素的hashCode()计算出来的
        2-1.如果哈希值不同,则直接添加到集合中;
        2-2.如果哈希值相同,则继续通过equals()来比较
            3-1.返回true,说明元素重复,不添加
            3-2.返回false,说明元素不重复,添加
    
    结论:
    我们使用HashSet集合来存储对象,你想保证元素的唯一性,就必须重写它的hashCode()和equals()方法
  • 相关阅读:
    复变函数
    abc136
    点集
    一些数学题
    牛客多校第六场
    牛客多校第五场G
    复数
    generator 1
    digits 2
    Winner
  • 原文地址:https://www.cnblogs.com/Baker-Street/p/15024333.html
Copyright © 2011-2022 走看看