Java hashCode详解
hashCode方法是用来获取散列码,定义在Object类中。如果所使用的类没有重写hashCode方法的话,那么调用hashCode方法将返回该对象的存储地址。
String类使用下列算法计算散列码:
//String
public int hashCode() {int h = hash;if (h == 0 && !hashIsZero) {h = isLatin1() ? StringLatin1.hashCode(value): StringUTF16.hashCode(value);if (h == 0) {hashIsZero = true;} else {hash = h;}}return h;}
//StringUTF16
public static int hashCode(byte[] value) {int h = 0;int length = value.length >> 1;for (int i = 0; i < length; i++) {h = 31 * h + getChar(value, i);}return h;}
//StringLatin1.
public static int hashCode(byte[] value) {int h = 0;for (byte v : value) {h = 31 * h + (v & 0xff);}return h;}
当我们在需要重写hashCode方法时,可以合理组合实例域的散列码,以便能够让各个不同的对象产生的散列码更加均匀。
最方便的方法是调用Objects.hash方法并提供你想要使hash值与哪些实例域相关的实例域。比如要对一个实例域有String name;String hireDay;Double salary的类进行重写hashCode方法,可以采取:
public int hashCode(){return Objects.hash(name,salary.hireDay);
}
通过该方法,可以获得一个与这三个实例域相关的hash值。
需要注意的是,如果重新定义equals方法,就必须重新定义hashCode方法。这样做的目的是为了能够将对象插入到散列表中。
1.在HashSet 或者HashMap中,要保证没有重复的元素。
2.如果重写了equals方法而没有重写hashCode方法会出现什么呢?
(1)Object中equals方法是比较两个对象的引用地址,既然我们重写equals方法,肯定是希望能够通过比较两个对象的某一些或全部的实例域是否相等来判断两个对象是否为同一个对象。
(2)当我们在使用HashSet时,如果没有重写hashCode,那么两个通过重写的equals判断为相等的对象将拥有不同的hash值,因为默认的hashCode是返回对象存储地址。这时候这两个相同的对象将被添加到HashSet中,这就与HashSet的定义矛盾。
同时equals方法和hashCode方法的定义必须一致:如果x.equals(y)
返回true,那么x.hashCode()就必须与y.hashCode()具有相同的值。
Java hashCode详解相关推荐
- Java :反射详解
Java 反射详解 目录 Java 反射详解 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 1.什么是反射? Java反射就是在运行状态中,对于任意 ...
- Java集合详解6:TreeMap和红黑树
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- Java集合排序及java集合类详解
Java集合排序及java集合类详解 (Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分.能够用好集合和理解好集合对于做Java程序的开 ...
- Java集合详解4:HashMap和HashTable
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- java map详解
java map详解 Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类 ...
- Java集合详解5:深入理解LinkedHashMap和LRU缓存
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- Apache Thrift - java开发详解
2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...
- Java泛型详解-史上讲解最详细的,没有之一
目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...
- Java虚拟机详解----JVM常见问题总结
[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...
最新文章
- SQL Server日志清除的两种方法 .
- Ios之label自适应里面的文字,自动调整宽度和高度的
- 我在老男孩学python的日子_day1
- java开发展望怎么写_Java开发趋势:2019年展望
- Alsa里面恶心的DAPM
- 我做的第二个正则转换工具
- css内容渐入效果实现
- 负载均衡集群HAProxy安装篇
- Jensen 不等式
- ***X档案2007配套光盘
- 使用Python爬取百度热搜榜
- mysql的chakan biao_MySQL_Mysql中文汉字转拼音的实现(每个汉字转换全拼),一、创建拼音对照表
复制代 - phpStudy...
- 分布式 | 如何与 DBLE 进行“秘密通话”
- cocos creator 加载微信云端图片
- adb命令重置_Android ADB 常用命令
- ubuntu18关不了机
- indexedDB整理
- go 函数os.OpenFile
- android studio高德地图的显示于定位(附带逆地理编码围栏)
- (转载)Android 让WebView完美支持https双向认证(SSL)