转:http://m.blog.csdn.net/blog/pengchua/2297547#

如果你为某个类写了equals方法,那么应该同时编写hashCode方法.
如果没有提供hashcode方法,编译器不会报错,而且也可能不会遇到任何问题.但是将对象插入到
基于冲突的哈希表(类java.util.Set也使用同样的哈希表实现)可能导致不可预料的后果.解决产生的问题,
可能要花费大量的时间.所以一定要养成这样的习惯:如果编写了方法equals,同时也提供相应的hashcode方法

equals():
它是用于进行两个对象的比较的,是对象内容的比较。
对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必

须遵循的。否则,你就不该浪费时间:
    * 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
    * 反射性:x.equals(x)必须返回是“true”。
    * 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)

也应该返回是“true”。
    * 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复

x.equals(y)多少次,返回都是“true”。
    * 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回

是“false”。

hashCode():
这个函数返回的就是一个用来进行哈希操作的整型代号,请不要把这个代号和前面所说的参阅

变量所代表的代号弄混了。前者不仅仅是个代号还具有在内存中才查找对象的位置的功能。

hashCode()所返回的值是用来分类对象在一些特定的Collection对象中的位置。这些对象是

HashMap, Hashtable, HashSet,等等。这个函数和上面的equals()函数必须自己设计,用来

协助HashMap, Hashtable, HashSet,等等对自己所收集的大量对象进行搜寻和定位。

这些Collection对象究竟如何工作的,想象每个元对象hashCode是一个箱子的编码,按照编码

,每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个

HashSet,HashMap,或 Hashtable对象,我们需要寻找一个元对象时,先看它的代码,就是

hashCode()返回的整型值,这样我们找到它所在的箱子,然后在箱子里,每个元对象都拿出来

一个个和我们要找的对象进行对比,如果两个对象的内容相等,我们的搜寻也就结束。这种操

作需要两个重要的信息,一是对象的 hashCode(),还有一个是对象内容对比的结果。

hashCode()的返回值和equals()的关系如下:

* 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
    * 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。因为不

同的对象返回相同的哈希值,也就是冲突。

为什么这两个规则是这样的,原因其实很简单,拿HashSet来说吧,HashSet可以拥有一个或更

多的箱子,在同一个箱子中可以有一个或更多的独特元对象(HashSet所容纳的必须是独特的

元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个

元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。

当一个对象类型作为Collection型对象的元对象时,这个对象应该拥有自己处理equals(),和/

或处理hashCode()的设计,而且要遵守前面所说的两种原则。equals()先要查null和是否是同

一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查 null是为了

避免出现NullPointerException这样的异常给丢出来。

java equals 与 hashCode的更多相关文章

  1. 总结Java equals()和hashCode()的联系

    Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...

  2. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  3. Java == ,equals 和 hashcode 的区别和联系(阿里面试)

    今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...

  4. Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用 Spring 数据绑定? ,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦 ...

  5. Java equals 和 hashcode 方法

    问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...

  6. Java equals() 和hashCode()方法详解

    Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个对象(引用地址) ...

  7. java equals 和hashcode

    1  如果不知道怎么重载hashcode, eclipse自动代码生成工具会帮助你生成,大概的思路是设定一个int prim,  然后根据各个成员的值或者hashcode值进行某种运算即可,具体什么运 ...

  8. java equals和hashcode方法

    equals()方法比较两个对象的引用是否相同 hashcode()方法比较两个对象的哈希码是否相同

  9. equals()与hashCode()方法协作约定

    翻译人员: 铁锚 翻译时间: 2013年11月15日 原文链接: Java equals() and hashCode() Contract 图1 Java所有对象的超类 java.lang.Obje ...

随机推荐

  1. 精读《12 个评估 JS 库你需要关心的事》

    1 引言 作者给出了从 12 个角度全面分析 JS 库的可用性,分别是: 特性. 稳定性. 性能. 包生态. 社区. 学习曲线. 文档. 工具. 发展历史. 团队. 兼容性. 趋势. 下面总结一下作者 ...

  2. windows和linux上mysql的安装

    mysql基于多平台,多版本的安装 mysql.tar.gz  链接:https://pan.baidu.com/s/1lG9BNL1mG4qbjM8xLHtrjQ 密码:s4tk MySQL 是一个 ...

  3. scrapy--BeautifulSoup

    BeautifulSoup官方文档:https://beautifulsoup.readthedocs.io/zh_CN/latest/#id8 太繁琐的,精简了一些自己用的到的. 1.index.h ...

  4. 如何理解MVVM?

    随着前端页面越来越复杂,用户对于交互性要求也越来越高,MVVM模型应运而生. MVVM最早由微软提出来,它借鉴了桌面应用程序的MVC思想,在前端页面中,把Model用纯JavaScript对象表示,V ...

  5. windows系统下用VScode配置远程编辑服务器文件的环境!通过Rmate方法

    虽然公司电脑win可以通过Xshell通过SSH远程连接家中内网linux服务器了,但是只能用vim编辑文件有点不爽. 于是上网查询,windows下使用vscode远程编辑服务器文件的办法.参照博文 ...

  6. 学习python第十一天,函数3 函数的序列化和反序列化

    我们把变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unp ...

  7. P1338 末日的传说 逆序数对

    题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...

  8. 006---Django静态文件配置

    静态文件:Js.Css.Fonts.Image等 这个不难.在setting.py文件加一行 # 别名 用户在url地址栏输入127.0.0.1:8000/static/文件 可以直接访问static ...

  9. Card Hand Sorting 18中南多校第一场C题

    一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况 ...

  10. Still unable to dial persistent://blog.csdn.net:80 after 3 attempts

    动不动电脑有些网站打不开了,还报错: Still unable to dial persistent://blog.csdn.net:80 after 3 attempts 为什么呢? 是dns坏了? ...