`
zyfautonavi
  • 浏览: 14820 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

equals() 与 hashCode

阅读更多
equals() 与 hashCode
以下来自网络:
object的equals()和hashCode()比较的是两个对象的地址的整数值,这是object的默认实现。在实际应用中,我们经常需要覆盖这两个方法,规则和原因如下:

hashCode()返回一个对象的hash 代码,在hashtable数据结构实现的集合中,它决定了这个对象被放到哪个bucket(篮子)中。一个bucket中可能存放了多个对象。而equals方法则是进一步到bucket寻找具体对象的依据。
为了hashtable数据结构能正常工作,hashCode方法的通用协议是:equals方法定为相等的两个对象的hashCode()返回的整数一定相同。只有这样才能在hashtable数据结构中找到这个对象。而equals方法定为不相等的两个对象的hashCode()返回的整数可以不相同,如果相同则为哈西冲突。所以尽量保证equals方法定为不相等的对象的hashCode()返回的整数不相同。

类Object实现的hashCode使用对象的内部地址转化为整数返回,使得o1.equals(o2)当且仅当o1.hashCode()== o2.hashCode

总结:
网上关于hashCode与equals的文章许多,但没几个说的很透彻的。下面是我的一点体会。
如果采用数组来存取数据的话,要查找某一个key,时间复杂度是O(n),如果已经排了序,可以采用二分查找,时间复杂度为O(log2n).如果能有这样一种方法,将key的值与存储地址一一对应,那么效率就会有很大的提高。我们就采用一个哈西函数Hey(key),该函数的返回值就是存储的地址,比如y=value%n+1(这是一个比较常用的除留余数法).n指的是将要存储的元素的个数。为什么函数要和元素的个数有关系呢?因为存储必然要开辟空间,而空间应该尽量连续,元素和元素之间尽量没有空间浪费,当然Hey(key)有许多不同的算法来计算地址来达到这一个目的。朋友一定会发现上面的除留余数法很可能出现这样的问题,相同的value一定产生相同的y,但不同的value很可能产生相同的y。这就是hash冲突。当遇到这样的情况,我们可以利用这样的一个函数Mey(y):y= (Hey(value)+1)%m,m为地址空间的小篮子的数量,m一定大于n。假如我们想在18个空间放13个元素,m=18,n=13.还有一种处理冲突的办法叫做链表法,也就是说将会有18个链表,每个存储地址指向这个链表的首地址,相当于每个地址都是篮子,里面装的是hashcode相等但value不同的元素。关于hash存储就说到这里,这里建议去参考教材。
另外假如value的值特别大,y的值有可能会非常大,所以y不能直接作为存储地址,而是y和存储地址还有一个一一对应的关系。我们可以简单的看成value对应地址。

说道这里,想必朋友们已经知道hashcode和equals的关系了。HashMap ,HashSet作为集合的容器,采用的是hash存储。Hashcode就是hash函数,hashSet与hashMap的功能大家都知道,就是key唯一。假如我们加入的元素认为相等而他的hashcode不等,则会存储两个相等的元素,也就不能正常工作。道理朋友们想去吧。这也就要求我们覆盖hashcode的时候应该和equals保持一致,还要注意程序的健壮性,比如null的判断。同时还应该尽量让那个不等的元素的hashcode也要不等,考虑到性能。
说起性能不得不提负载因子,其实就是n/m(13/18).这个值越大说明实现开辟好的存储空间越满,值越小那么冲突与查找的性能也就越好,试想,在一个100个空间里查找3个元素,是不是很浪费?或者我要遍历这个空间,是不也会很慢?所以我们要做一个空间与时间的权衡。hashMap与hashset的默认负载因子是0.75也就是空间还有三分之一的空间,hashMap与hashset创建的时候可以指定空间的容量。根据实际情况我们可以设置初始值。

分享到:
评论

相关推荐

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    equals,hashcode,toString

    `hashCode()` 方法则与`equals()`密切相关。在哈希表(如HashMap、HashSet)中,对象的哈希码用于快速定位对象存储的位置。当两个对象通过`equals()`方法判断为相等时,它们的`hashCode()`方法返回值也应该相等。...

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    equals-hashcode-processor-1.0.0.zip

    "retry.zip"中的开源项目"equals-hashcode-processor-1.0.0"为我们提供了一个优雅的解决方案,通过这个库,我们可以轻松地为Scala Futures实现自动重试逻辑。 首先,我们需要理解Scala Futures的基础。Futures是...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    关于重写equals,hashcode以及compareTo方法!

    在某些情况下,我们需要重写hashcode()方法,使其生成对象的哈希码,并且使其与equals()方法保持一致。 例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    equals 和 hashCode两者效果分析详解.docx

    在Java编程语言中,`equals()`和`hashCode()`方法是两个非常重要的概念,尤其是在处理对象比较和容器(如HashMap和HashSet)操作时。这两个方法在Java的类库中有着核心地位,尤其是对于类实例的比较和存储。接下来,...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    深入理解equals和hashCode方法

    但是,我们在重写equals方法时,也需要重写hashCode方法,以保证对象的哈希码与equals方法的结果一致。 equals和hashCode的关系 equals和hashCode方法之间存在紧密的关系。在重写equals方法时,我们也需要重写...

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

Global site tag (gtag.js) - Google Analytics