Java Object.hashCode()方法

@(JAVA)[java]

更详细的内容可以参考《effective java》与《think in java》

Object类有一个hashCode()方法,它用于计算一个对象的hash值,同时,它也用于表示这个对象在内存中的位置。

如果一个类重写了equals()方法,则必须重写hashCode()方法。2个对象的equals()方法返回true的话,其hashCode()必须返回相同的值。否则对于HashSet, HashMap, HashTable等基于hash值的类就会出现问题。

当往HashSet(其它类似)add一个新元素时,jvm会判断这个元素是否已经存在于这个Set中,它会根据hashCode()返回的值去定位这个元素,看是否存在这个java对象。如果2个元素的equals()方法返回true,则它们应该是认为同一个元素的,但如果它们的hash值不相等,则导致jvm找不到旧的元素,从而认为新的元素不存在,导致重复插入数据。

看一下String的hashCode:

public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}

String是以每个字母的值来计算hash的,因此当字母相同时,String也是equals。

我们再看一下一般应该如何定义一个hashCode()方法:

public class Employee {private String name;private String phone;private String address;@Overridepublic boolean equals(Object obj) {if (obj instanceof String) {Employee other = (Employee) obj;return (this.name.equals(other.name) && this.phone.equals(phone));}return false;}@Overridepublic int hashCode() {return 7*name.hashCode() + 11*phone.hashCode();}public int hashCode2() {return 7* Objects.hash(name) + 11* Objects.hash(phone);}public int hashCode3() {return Objects.hash(name,phone);}
//还有各个getter与setter。}

我们假设当name和phone相同时,则认为这2个对象是equals的。

hashCoe()方法是传统的方法,hashCode2()和hashCode3()这2种办法都是JDK7以后支持的,可以简化代码,而且可以避免name为空之类的情形,尤其第3种。
如不需要严格控制hash值,则使用第3种。如要控制hash值,则用第2种。

Java Object.hashCode()方法相关推荐

  1. java重写hashcode方法代码_Java重写hashcode方法

    覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个 覆写hashcode 1. 把某个非零常数值 ...

  2. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

  3. java中hashCode方法与equals方法的用法

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  4. Java重写hashcode方法

    1.先初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17; 2.选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算: (1) 如果是boolean值 ...

  5. java中的equals方法+hashCode方法

    [0]README 0.1)以下内容均为原创,包括源代码, 旨在理清 equals 和 hashCode 方法的 实现原理: 0.2) for full resource code, please v ...

  6. Java Date hashCode()方法与示例

    日期类hashCode()方法 (Date Class hashCode() method) hashCode() method is available in java.util package. ...

  7. java中equals方法的参数_equals方法的参数必须为Object类型的引用变量

    核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...

  8. java wait 参数_Java Object wait()方法

    Java Object wait()方法 java.lang.Object.wait(long timeout, int nanos) 导致当前线程等待,直到其他线程调用此对象的 notify() 方 ...

  9. 《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法

    散列码( hash code ) 是由对象导出的一个整型值.散列码是没有规律的.如果 x 和 y 是两个不同的对象, x.hashCode( ) 与 y.hashCode( ) 基本上不会相同. 在表 ...

最新文章

  1. 解决windows7下vs2008不能正常编译ActiveX控件的问题
  2. 武汉网络推广浅析当网站停止收录时该检查哪些问题?
  3. linux 可执行文件权限不够,root执行/media可执行文件权限不够,chmod修改权限无效...
  4. 天池在线编程 2020国庆八天乐 - 6. 山谷序列(DP)
  5. 双11特刊|购物车实时显示到手价,看云原生内存数据库Tair如何提升用户体验?
  6. CVPR 2020 算法竞赛大盘点
  7. 【vscode】vscode + vue项目实战记录
  8. 基于ServerSokect和Soket的简易Qq程序
  9. 蓝桥杯c语言b组试题及答案,2014蓝桥杯C语言本科B组预赛试题
  10. 微信小程序倒计时功能
  11. 数仓(一)简介数仓,OLTP和OLAP
  12. iOS 苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程
  13. 在vue中修改数组某个元素,值变了,渲染不了
  14. 一文读懂NFT(非同质化通证)
  15. Vuex dispatch用法
  16. 虚拟服务器C盘备份,分享:两种快速虚拟机备份方法
  17. matebook14支持触摸屏吗_2020款的matebook14增加了多点触控屏是最大亮点
  18. 一、mysql数据库基本框架
  19. 化学反应动力学-常见微分方程模型的大一统形式
  20. 视图实现圆角效果的三种方法及比较

热门文章

  1. Python函数中的变量作用域
  2. String,char,数组,列表 相互转化 (更新中)
  3. activemq5.14 mysql_activemq5.14+zookeeper3.4.9实现高可用
  4. 冷藏温度范围_冰箱冷藏温度多少合适 冰箱冷藏温度调节范围
  5. Java串口包Javax.comm的安装
  6. 手机利用python访问电脑文件_黑客教程,一行python命令让手机读取电脑文件!
  7. qgraphicsview 添加矩形框并拖动改变大小_如何用手机巧影软件为视频添加字幕
  8. python 输出引号_python输出字符串单双引号如何选择
  9. python基本程序结构有几种_python基础梳理(一)(推荐)
  10. xms和xmx为什么要相同_股民为什么要做股票配资?