网上一搜equals和hashCode全是详解,深入剖析,巴拉巴拉。都写的非常详细,能学到很多东西。写这个就为了表达一下自己的理解,以及需要理解的程度。
刚学java,都是说字符串不能用==比较相等,要用equals,其实就是说对于引用类型的比较不能直接用==比较是否相等,因为比较的是对对象的地址,而我们期望的往往是对象内的属性值相等。
当我们自定义的类使用equals比较的时候,基本是没用,还是比较的地址,也即是equals默认就是使用==来比较的。那么问题来了,什么时候需要重写equals方法呢?以及该怎么重写呢?
很简单,就是当我们在set或者map的key使用自定义类的时候,怎么样对对象去重,就是根据equals和hashCode方法来的,这就是为什么很多人都说,重写equals方法必须要重写hashCode方法。
那么equals和hashCode究竟应该怎么重写,有什么要求吗?当然有,java规定是,equals相等时,hashCode必须相等,而并不要求hashCode相等时,equals必须相等。为什么要有这么规定,其实是和set以及map的结构有关系,set和map底层都有一个hash表,其实就是一个数组,添加一个新元素进来的,先用hashCode计算hash值,然后用hash表的长度取模,这样就相当于找到了这个元素应该放入的位置。这就是为什么equals相等时,hashCode必须相等,否则hashCode不相等,如果进入到其他位置了,岂不是就出现重复元素了。但是还有问题就是,假如两个不同元素如果hashCode相等了呢,又或者说假如两个对象经过hahs算法以后最终进入到同一个位置的时候,是第二个覆盖第一个还是怎么着?当然不会随便覆盖,这时候,如果有多个元素经过hash算法到同一个位置的时候,来一个元素,首先和位置的已有元素使用equals进行比较,如果相等,则会覆盖,如果不相等,则会加进去。
刚说加进去,怎么加进去的呢?当然是每个hash表的位置元素都是一个链表呀,来一个不重复的就在链表后加一个元素,这也就是hashmap的底层其实数组加链表的结构,hashset相当于只用了hashmap的key,到底什么意思,其实hashmap的底层是一个node类型的数组,node包含了key和value还有一个node类型next,hashset相当于只用了hashmap中node中的key,value设置成一个不变的对象,所有key都是同一个value,因为用不到,至于next还是一样的用。
相关推荐
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将详细地介绍Java重写equals及hashCode方法的...
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。 equals 方法是用于比较两个对象是否相同的。它的...
其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...
在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...
Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中定义的基本方法,所有类都默认继承自Object类,因此每个Java对象都有这两个方法。这两个方法在处理集合类,尤其是Set接口的实现(如HashSet)时起着...