`

关于hashCode与equals方法的说明

 
阅读更多
关于hashCode与equals方法的说明:

1)对于一个程序的一次执行过程中,同一个对象的hashCode计算的结果一定相同,但是对于同一个程序的不同执行过程中,不要求其hashCode一定相同。

2)对于两个对象,如果使用equals方法比较,结果为true,那么这两个对象的hashCode值一定相同

3)对于两个对象,如果使用equals方法比较,结果为false,那么这两个对象的hashCode值不要求一定不同(但是如果不同可以提高程序性能)

当 我们向HashSet中add对象,它首先调用它的HashCode方法,得到这个HashCode的返回整数值,这个整数值就会映射到set里面的某一 个位置。如果这个对象里没有对象存在,就把这个对象直接放发哦set里面;如果这个位置已经有对象存在了,这个时候就用equals方法比较这两个方法, 如果比较结果相同,就不进行插入。比如下面问题

Set set = new HashSet();

set.add("zhangsan");

set.add("lisi");

set.add("wangwu");

set.add("zhangsan");

这个最后一个set.add("zhangsan");是无法插入成功的,因为String重写了Object的equlas和HashCode方法,按照String的HashCode方法,相同的字符串的HashCode一定是一样的

下面详细分析最后一个set.add("zhangsan")具体插入过程

1.首先根据"zhangsan"调用HashCode方法,获得一个返回值

2.Set根据这个返回值获得一个位置

3.查找这个位置上是否有对象,结果发现有一个对象。值也是“zhangsan”

4.对两个对象调用equals方法,由于String重写了equals方法,这个方法返回true。

所以最后插入失败。

再看下面这个例子

People p1 = new People("zhangsan");

People p2 = new People("lisi");

People p3 = new People("wangwu");

People p4 = new People("zhangsan");

People p5 = new People("zhangsan");

set.add(p1);

set.add(p2);

set.add(p3);

set.add(p4);

set.add(p5);

由于People 继承自Object类,且没有重写equals和HashCode方法,而object的HashCode方法每个不同对象的返回值都是不同的,所以第一步查找插入位置的时候各个对象的位置就不一样,所以一定可以插入进去。

Object类的HashCode实际上根据对象的地址生成的,所以不同对象的HashCode必然不一样,但是String的HashCode是根据字符串的内容和大小生成的,所以相同字符串的HashCode是一样的。

HashSet和HashMap

1. HashSet底层采用HashMap实现

HashMap内部是无序的,取出的顺序和放入的顺序没有关系。java提供了TreeMap是有序的。

2. 这个HashMap的key就是放进HashSet中的对象,而value就是一个Object类型的对象,这个value我们不关心它到底是什么,事实上这是一个随意生成的object对象。

3. 当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet中增加的那个对象,该行的value就是一个Object类型的常量

4. HashMap底层采用数组维护,这个数组中每个元素实际上又是一个单链表,拥有相同HashCode值的key对应的键值对就放在这个单链表中。

当 调用add方法,首先根据这个key的HashCode方法算出一个int值,这个int对应到数组的一个位置,由于可能会有不同的key有相同的 HashCode值,所以这个位置上存放的是一个链表。然后这个新加进来的key会和这个链表中的每个元素的key调用equals方法进行比较。如果返 回true,就用这个新的键值对替换掉链表中原来那个老的键值对。如果找到最后都没有返回true,就把这个新的键值对添加到链表的头。(之所以不添加到 链表的尾是为了提高检索效率,新添加的数据被检索的可能性要高。)

5. 调用增加的那个对象的hashCode方法,来得到一个hashCode值,然后根据该值计算出一个数组的下表索引(计算出数组中的一个位置)

6. 将 准备增加到Map中的对象与该位置上的对象进行比较(equals方法),如果相同,那么就将该位置上的那个对象(Entry类型)的value值替换 掉;否则,沿着该Entry的链继续重复上述过程,如果到链的最后依然没有找到与此对象相同的对象,那么这个时候就会将该对象增加到数组中,然后将数组中 该位置上的那个对象链到这个新对象的后面。

7. 对于HashSet,HashMap来说,这样做的原因就是为了提高查找的速度,使得查找时间不随Set或者Map的大小而改变。
分享到:
评论

相关推荐

    hashcode和equals方法

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

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    java中hashcode和equals的详解.pdf

    Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...

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

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

    关于hashCode()和equals()的本质区别和联系

    如果我们忽略 equals() 和 hashCode() 方法,那么我们将不能可靠地检索相关的值,除非我们在 get() 调用中使用与 put() 调用中极其类似的对象实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的对象的...

    Java中hashCode和equals方法的正确使用

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。  hashCode()和equals()定义在Object类中,这...

    hashcode和equals的分析

    ### hashCode和equals方法详解 #### 一、hashCode方法解析 在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合...

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

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

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

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

    java中hashcode()和equals()方法详解

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    重写hashCode()和equals()方法详细介绍

    在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...

    equals与hashCode方法讲解

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

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

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

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

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

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

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

    hashcode、equals、==总结1简单总结.txt

    hashcode、equals、==总结1简单总结.txt,他们之间的区别

    Java_重写equals()和hashCode()

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

    java中hashCode、equals的使用方法教程

    `hashCode()`的返回值应该与`equals()`方法保持一致关系。如果两个对象根据`equals()`方法比较是相等的,那么它们的`hashCode()`也应该相等。反之,如果`equals()`返回`false`,`hashCode()`则可以相等也可以不等。...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    重写`hashCode()`时,应确保它与`equals()`方法的逻辑一致。通常,`hashCode()`应该基于对象的那些参与`equals()`比较的属性来计算。如果两个对象`equals()`相等,它们的`hashCode()`应该返回相同的整数值。如果`...

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

Global site tag (gtag.js) - Google Analytics