zoukankan      html  css  js  c++  java
  • Java中HashCode()和equals()的关系

    在谈及两者关系之前应该先说说这两个东西是什么?

    hashcode()

    hashCode() 的意思是哈希值(散列值),哈希值是经哈希函数运算后得到的结果,哈希函数能够保证相同的输入能够得到相同的输出(哈希值),但是不能够保证不同的输入总是能得出不同的输出。

    当输入的样本量足够大时,是会产生哈希冲突的,也就是说不同的输入产生了相同的输出,至于如何解决冲突并不是我们的重点,暂时不谈。

    就相同的输入能够产生相同的输出这点而言,是及其宝贵的。它使得系统只需要通过简单的运算,在时间复杂度O(1)的情况下就能得出数据的映射关系,根据这种特性,散列表应运而生。

    一种主流的散列表实现是:用数组作为哈希函数的输出域,输入值经过哈希函数计算后得到哈希值。然后根据哈希值,在数组种找到对应的存储单元。当发生冲突时,对应的存储单元以链表的形式保存冲突的数据。

     

    equals()

    equals() 方法用于比较两个对象是否相等,它与 == 相等比较符有着本质的不同。

    在万物皆对象的 Java 体系中,系统把判断对象是否相等的权力交给程序员。具体的措施是把 equals() 方法写到 Object 类中,并让所有类继承 Object 类。 这样程序员就能在自定义的类中重写 equals() 方法, 从而实现自己的比较逻辑.

     

    深入理解 hashCode() 和 equals() 之间的关系

    假如在一个容器当中,比如Map之类的,我们想要查找在当前容器中有没有与新元素相同的元素,也许我们会说直接使用equals()方法直接比较不就行了嘛?

    如果容器中的存储的对象数量较少,这确实是个好主意,但是如果容器中存放的对象达到了一定的规模,要调用容器中所有对象的 equals() 方法和新元素进行比较,就不是一件容易的事情了。

    就算 equals() 方法的比较逻辑简单无比,总的来说也是一个时间复杂度为 O(n) 的操作啊。

     

    但在散列表的基础上,判断“新对象是否和已存在对象相同”就容易得多了。

    由于每个对象都自带有 hashCode(),这个 hashCode 将会用作散列表哈希函数的输入,hashCode 经过哈希函数计算后得到哈希值,新对象会根据哈希值,存储到相应的内存的单元。

    我们不妨假设两个相同的对象,hashCode() 一定相同,这么一来就体现出哈希函数的威力了。

    由于相同的输入一定会产生相同的输出,于是如果新对象,和容器中已存在的对象相同,新对象计算出的哈希值就会和已存在的对象的哈希值产生冲突。

    这时容器就能判断:这个新加入的元素已经存在,需要另作处理:覆盖掉原来的元素(key)或舍弃。

    按照这个思路,如果这个元素计算出的哈希值所对应的内存单元没有产生冲突,也就是没有重复的元素,那么它就可以直接插入。

    所以当运用 hashCode() 时,判断是否有相同元素的代价,只是一次哈希计算,时间复杂度为O(1),这极大地提高了数据的存储性能。

     

    前面我们还提到:当输入样本量足够大时,不相同的输入是会产生相同输出的,也就是形成哈希冲突。

    这么一来就麻烦了,原来我们设定的“如果产生冲突,就意味着两个对象相同”的规则瞬间被打破,因为产生冲突的很有可能是两个不同的对象!

    而令人欣慰的是我们除了 hashCode() 方法,还有一张王牌:equals() 方法。

    也就是说当两个不相同的对象产生哈希冲突后,我们可以用 equals() 方法进一步判断两个对象是否相同。

    这时 equals() 方法就相当重要了,这个情况下它必须要能判定这两个对象是不相同的。

    • 讲到这里就引出了 Java 程序设计中一个重要原则:

    如果两个对象是相等的,它们的 equals() 方法应该要返回 true,它们的 hashCode() 需要返回相同的结果

    这个规则应该严格遵守,否则可能会引起不必要的麻烦。

  • 相关阅读:
    模板、中间件以及MVC与MTV
    Cookie与Session
    分页与网页攻击
    Django一对一查询,列类型及参数
    Django ORM 查询
    Django中ORM多对多表的操作
    Django中的ORM
    一、Vue简介
    三、路由层(urls.py)
    二、django简介
  • 原文地址:https://www.cnblogs.com/afei1013/p/12357450.html
Copyright © 2011-2022 走看看