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()返回的值一定相等一下

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

java中间==、equals和hashCode差额的更多相关文章

  1. Java:重写equals()和hashCode()

    Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...

  2. java中equals和hashCode方法随笔二

    前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...

  3. Java中equals和hashcode的区别?

    Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...

  4. java中equals和hashCode方法的解析

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  5. Java实战equals()与hashCode()

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

  6. java的equals()与hashCode()以及包装类中的实现

    1. hashcode 1.1 hashcode来源 1.2 hashcode的形式 1.3 hashcode目的 1.4 hashcode规则 1.5 hashcode作用体现 1.6 重写hash ...

  7. java ==、equals、hashcode有什么区别

    1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下, ...

  8. java学习-- equals和hashCode的关系

    hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...

  9. Java中equals,hashcode

         在Java语言中,Object对象中包含一个equals和hashCode方法,其中hashCode方法是由JVM本地代码(native code)实现的,返回值是一个有符号的32位整数,对 ...

随机推荐

  1. wordpress搭建后地址栏页面显示IP地址的问题

    搭建了wordpress.也在万网加入了A记录,这时訪问站点(我的是yesareno.com),发现仅仅在yesareno的主页,地址栏是域名.点击进入其它界面发现地址栏变成了ip地址,例如以下图 竟 ...

  2. ZooKeeper的安装、配置、启动和使用(一)——单机模式

    ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...

  3. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...

  4. Codeforces Round #296 (Div. 2) A B C D

    A:模拟辗转相除法时记录答案 B:3种情况:能降低2,能降低1.不能降低分别考虑清楚 C:利用一个set和一个multiset,把行列分开考虑.利用set自带的排序和查询.每次把对应的块拿出来分成两块 ...

  5. UVA 10892 LCM Cardinality(数论 质因数分解)

    LCM Cardinality Input: Standard Input Output: Standard Output Time Limit: 2 Seconds A pair of number ...

  6. KMP算法的Next数组详解(转)

    转载请注明来源,并包含相关链接. 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧: http://www.cnblogs.com/yjiyjige/p/3 ...

  7. Algorithm Part I:Priority Queues

    1.binary heap实现 BinaryHeap.h #ifndef BINARYHEAP_H #define BINARYHEAP_H class BinaryHeap { public: Bi ...

  8. 用XAML做网页!!—页头

    原文:用XAML做网页!!-页头 接续上次进度,我们此次来制作页头. 首先要实现两侧边缘的美化,如下图所示: 在边缘处有一层朦胧的亮度反光效果,这也是通过简单的渐变实现的,而且我们在后面的每个区块中都 ...

  9. V5

    系统设置--关于手机--版本号点5下--进去开发模式--打开开发选项--打开USB调试.然后在连接第三方助手软件 http://bbs.ztehn.com/thread-19037-1-1.html

  10. 用NMAKE创建VS2012 C++工程 HelloWorld

    由于需要精通GDAL的源代码,所以还是有必要精通NMAKE,先来尝试创建一个NMAKE工程. 之前一篇文章Windows7中Emacs 24 shell使用Gitbash已经介绍了如何在Emacs的s ...