java中间==、equals和hashCode差额

简介:
    java于==、equals()、hashCode()和比较两个对象。
  1. 关于==

        ==是easy理解的。java设计java就是要比較两个对象是不是同一个对象。

        对于引用变量而言。比較的时候两个引用变量引用的是不是同一个对象。即比較的是两个引用中存储的对象地址是不是一样的。

        对于基本数据类型而言,比較的就是两个数据是不是相等,没什么歧义。

        因为对于基本数据类型而言。没有方法,所以不存在equal()和hashCode()的问题。以下的讨论都是针对引用类型而言的。


  2. 关于equals()

    为什么java会设计equals()方法?

        ==比較的是两个对象是否是同一个对象,这并不能满足非常多需求。

    有时候当两个对象不==的时候,我们仍然会觉得两者是“相等”的。比方对于String对象,当两个对象的字符串序列是一直的,我们就觉得他们是“相等”的。

    对于这种需求,须要equals()来实现。对于有这种需求的对象的类,重写其equals()方法便可,详细的“相等”逻辑能够依据须要自定义。

    须要注意的地方

        Object中equals()的默认实现是比較两个对象是不是==,即其和==的效果是同样的。

       java提供的某些类已经重写了equals()方法。

    自己写的类,假设须要实现自己的“相等”逻辑,须要重写equals()方法。

       

  3. 关于hashCode()

    为什么会设计hashCode()方法?

       hashCode()方法返回的就是一个数值。我们称之为hashCode吧。

    从方法的名称上就能够看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此非常easy判断出,我们须要每一个对象的hash码尽可能不同。这样才干保证散列的存取性能。其实,Object类提供的默认实现确实保证每一个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。

        分析到这个地方,看似没什么问题,三者的作用非常清晰,好像他们之间也没什么关系。

    在java的规范上。hashCode()方法和equals()方法确实能够没有关系。

        可是!!!

    !!!!有一个问题。

        问题例如以下:对于集合类HashSet、HashMap等和hash有关的类(以HashSet为例),是通过hash算法来散列对象的。

    对HashSet而言,存入对象的流程为:依据对象的hash码,经过hash算法。找到对象应该存放的位置,假设该位置为空,则将对象存入该位置;假设该位置不为空,则使用equals()比較该位置的对象和将要入的对象,假设两个相等,则不再插入,假设不相等,依据hash冲突解决算法将对象插入其它位置。

       而java规定对于HashSet推断是不是反复对象就是通过equals() 方法来完毕,这就须要在两个对象equals()方法相等的时候,hash码一定相等(即hashCode()返回的值相等)。如果两个对象equals()方法相等的时候,hash码不相等,会出现equals()相等的两个对象都插入了HashSet中,这时不同意的。从而我们有了一下的结论:

        结论:对于equals()相等的两个对象,其hashCode()返回的值一定相等一下

版权声明:本文博主原创文章,博客,未经同意不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4891573.html,如需转载请自行联系原作者


相关文章
|
存储 Java 开发者
Java 中的 equals 方法:看似简单,实则深藏玄机
本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。
894 1
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
267 4
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
212 3
java中“==”和equals,究竟比的是什么
|
存储 Java 索引
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
【Java基础面试二十一】、说一说hashCode()和equals()的关系
这篇文章讨论了Java中`hashCode()`和`equals()`方法之间的关系,强调如果两个对象相等,它们必须有相同的哈希码,但有相同哈希码的对象未必相等,并解释了这一关系在HashSet集合中判断元素是否重复的应用场景。
【Java基础面试二十一】、说一说hashCode()和equals()的关系
|
存储 Java
|
存储 Java 程序员
面试点:Java 中 hashCode() 和 equals() 的关系
面试点:Java 中 hashCode() 和 equals() 的关系
526 0
|
存储 Java 程序员
面试点:Java 中 hashCode() 和 equals() 的关系
面试点:Java 中 hashCode() 和 equals() 的关系
302 0