热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java中间==、equals和hashCode差额

java于、equals()、hashCode()和比较两个对象。关于是easy理解的。java设计java就是要比較两个对象是不是同一个
         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()返回的值一定相等一下

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


推荐阅读
  • 探索equals()和hashCode()方法  在根类Object中,实现了equals()和hashCode()这两个方法,默认:  equals()是对两个对象的地址值进行的比较(即比较引用是否 ... [详细]
  • Java集合类中常见的hashSet,hashMap,hashTable(现已很少用,几乎都采用hashMap替代)的实现都离不开散列表,而散列表的优势在于O(1)级别的查找,而has ... [详细]
  • 你知道一个对象的唯一标志不能仅仅通过写一个漂亮的equals来实现太棒了,不过现在你也必须实现hashCode方法。让我们看看为什么和怎么做才是正确的。相等和哈希码相等是从一般的方面 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 案例packagecn.itcast_02;importjava.util.HashSet;**需求:存储自定义对象,并保证元素的唯一性* ... [详细]
  • 转载请注明出处:http:blog.csdn.netsupera_liarticledetails45034203Effectivejava系列1.Effectivejav ... [详细]
  • 讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。
    讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。-1、equals和hashCode(哈希码)是什么? 两个都是Object类的方法equ ... [详细]
  • 还要谈谈Equals和GetHashcode
    这篇随笔和上篇随笔《从两个数组中查找相同的数字谈Hashtable》都是为了下面分析Dictionary的实现做的铺垫一.两个逻辑上相等的实例对象。两个对象相等,除了指两个不同变量引用了 ... [详细]
  • Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ... [详细]
  • -------------------------------------------------android培训、java培训期待与您交流!--------------------------- ... [详细]
  • 本文来自:高爽|Coder,原文地址:http:blog.csdn.netghsauarticledetails16843543,转载请注明。HashMap可以 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
author-avatar
小流氓本尊_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有