zoukankan      html  css  js  c++  java
  • hashCode和equals

    hashCode介绍

    hashCode()的做用是获取哈希码,也称为散列码;它实际上返回的是一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object类中,java中的任何类都包含hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据键快速检索出对应的值。这其中就利用了散列码。

    堆中存储的对象就是利用这一个散列表 key是对象的散列码 value是对象的地址。

    为什么要有hashCode

    以HashSet如何检查重复为例来说明为什么要有hashCode
    对象加入HashSet时,HashSet会先计算对象的hashCode值来判断对象加入的位置,看该位置是否有值,如果没有,HashSet会假设对象没有重复出现。但是如果发现有值,这时会调用equals()方法来检查这两个对象是否相同。如果两者相同,HashSet就不会让其加入成功。如果不相同,就会重新散列到其他位置。这样就大大降低了equals的次数,大大提高了执行速度。

    • 如果两个对象相同,则hashCode一定也相同
    • 两个对象相等,对两个对象调用equals方法返回true
    • 两个对象有相同的hashCode值,他们也不一定时相等的。
    • 因此,equals方法被覆盖过,则hashCode方法也必须覆盖
    • hashCode默认时对堆上的对象产生独特值。如果没有重写hashCode,则该class的两个对象无论如何都不会相同。

    为什么重写equals方法要重写hashCode

    因为上面的第一条准则 如果两个对象相同,则hashCode一定也相同。equals方法在Object中默认是使用 == 比较对象是否相同,若此时重写了equals方法,判断两个对象里面值是否相同(类似于String类),此时new两个对象, 这两个对象值相同,那么此时的equals方法就会判断两个对象为true,如果不重写hashCode,那么这两个对象hashCode不相同,此时就违背了第一条原则,所以需要重写hashCode方法。

  • 相关阅读:
    shell 函数用法
    shell read变量的读入
    利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果
    shell重定向介绍及使用
    监控MySQL或Web服务是否正常
    centos 6.5下安装nmap工具及简单用法
    if条件简单语法
    shell 的条件表达式及逻辑操作符简单介绍
    mysql常见的错误代码
    Linux MySql 安装与配置(二进制包)
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/14787557.html
Copyright © 2011-2022 走看看