哈希码相同,值一定相同?
值相同,hashcode一定相同;hashcode相同但是值不一定相同
一、hashcode相同,值不一定相同
所有的类都是集成自Object类,在Object中有hashcode()方法,如果想具体了解此方法的含义,可以看源码注释
1、前提条件看类是否有重写hashcode()和equals()方法
此处我们使用Set集合来做演示,set有两个特性:
- 存入的数据元素不允许重复
- 没有索引(遍历只能使用Iterater或者是增强for循环(底层也是使用Iterater))
此处使用了Set集合的不允许重复元素的特性
@Testpublic void testHashCode(){System.out.println("重地".hashCode());//1179395System.out.println("通话".hashCode());//1179395}
因为这两个字符串比较特殊,他们的hashcode是相同的,这就验证了我们的结论,hashcode相同,但是值不一定相同。原因我们可以来看String的源码,可以添加断点进入String,可以看到String已经对重写了hashCode()方法
在jdk1.8之前hashSet的数据结构式数组+链表
在jdk1.8之后hashSet的数据结构:数组+链表+红黑树
这里我们再来看一个例子:
public void testHashCode() {Set<String> set = new HashSet<String>();set.add("测试");set.add("测试");set.add("重地");set.add("通话");for (String s : set) {System.out.println(s);}
//重地
//通话
//测试
“重地”“通话的”的hashcode相同,但是可以存入集合中,在向hashSet集合中添加元素时,需要经过两个步骤:
- 计算hashcode并与hashSet数组中的hashcode进行比较
- 如果有相同的hashcode,则对该hash的内容使用equals进行比较,如果不同则存入集合
因此相同的hashcode不一定有相同的值,但是如果值相同,那他的hashcode一定相同
二、HashSet存储自定义类型的数据
public class Persion {private String name;private Integer age;public Persion(){}public Persion(String name,Integer age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Persion{" +"name='" + name + '\'' +", age=" + age +'}';}/* @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Persion persion = (Persion) o;return name.equals(persion.name) &&age.equals(persion.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}*/
}@Testpublic void testHashCode() {Persion p1 = new Persion("张三",16);Persion p2 = new Persion("张三",16);Set<Persion> set = new HashSet<>();set.add(p1);set.add(p2);System.out.println(set);//[Persion{name='张三', age=16}, Persion{name='张三', age=16}]}
此时p1和p2的hashCode不同,所以可以存入HashSet,Persion重写hashcode和equal方法之后(alter+insert)即可实现效果
注:只要使用HashSet存储自定义类型的数据切记要重写equals和hashCode方法,
哈希码相同,值一定相同?相关推荐
- 哈希值 哈希码_什么是哈希? 哈希码如何工作-带有示例
哈希值 哈希码 哈希简介 (Introduction to hashing) Hashing is designed to solve the problem of needing to effici ...
- hashcode值指的是什么_哈希码值是什么?什么是哈希码?
默认分类 2010-07-09 13:20:44 阅读 193 评论 0 字号:大中小 订阅 哈希码值 是什么?什么事哈希码? 哈希值,私钥加密和公钥加密 1. 哈希值 哈希算法将任意长度的二进制值映 ...
- 为什么要关心均值和哈希码
等于和哈希码是每个Java对象的基本元素. 它们的正确性和性能对于您的应用程序至关重要. 但是,我们经常看到甚至有经验的程序员也忽略了类开发的这一部分. 在本文中,我将介绍一些与这两种非常基本的方法有 ...
- java字符串的哈希码_获取Java中字符串的哈希码
该hashCode()方法用于获取字符串的哈希码.此方法不接受任何参数,因为它是默认方法,并且它返回哈希码值. hashCode()给出了演示Java方法的程序,如下所示: 示例import java ...
- 哈希码以及Object.toString()简单理解
对哈希码和默认的toString()不了解,百度后总结如下: 一 哈希码 在Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等的.其次,哈 ...
- Android 获取android密钥哈希码(keytool -exportcert -alias openssl sha1 -binary | openssl base64)
由于业务需求需要集成国外的SDK,而国外的sdk需要Android端提供一个签名哈希值 起初我以为是跟集成国内的高德地址一样提供个SHA1的值即可,之前我也写过一篇博客:Android获取SHA1值的 ...
- 学习笔记40-哈希码(HashCode)
哈希码 哈希码是一种算法,它的目的是让同一个类的对象按照自己不同的特征尽量地有不同的哈希码,但是,不表示不同的对象哈希码完全不同.也可能有相同的情况.在Java中,哈希码代表对象的特征. hashCo ...
- Java,哈希码以及equals和==的区别(转载)
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方 ...
- java 中的哈希码
源博客地址 对哈希码和默认的toString()不了解,百度后总结如下: 一 哈希码 在Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等 ...
- C# 文件哈希码比较
文件哈希码比较,用于更新文件 public static bool CompareFile(string str1, string str2) { string ...
最新文章
- 智能+制造,聪明的公司都走上了智能制造的道路
- 信号系统的一些基本概念
- php think命令用不了,自定义 PHP think 命令无法在命令类文件里面使用 Db 类
- js 防抖 和 节流
- 中国船级社船舶设计审核云平台
- opencv waitKey() 函数理解及应用
- 在CrossOver中设置代理实现与特殊网段的网络连接
- 药一点进销存管理软件_gsp管理规范_财务管理软件
- Android短信验证码-使用mob免费版
- 【Python123】汽车迷
- yuv420sp转jpg
- 郭天祥 十天搞定单片机 (2)流水灯+蜂鸣器+调试
- [Python知识图谱] 二.哈工大pyltp词性标注、命名实体识别、依存句法分析和语义角色标注
- printf用法之打印二进制,八进制,十进制,十六进制
- Window11一键安装APK应用详细教程,及错误解决
- Python return函数
- 性能测试怎么做?性能测试指标,常用性能测试工具
- 对学校的希望和寄语_新学期对学校的寄语
- 不同操作系统中的换行符,回车符 \r , \n
- 彩色复古装饰麻绳-----四色麻绳
热门文章
- QQ实用功能(长截图、文字识别、屏幕录制,屏幕翻译)
- 学会对美工Say No---Material Design
- 【考研线代】三. 向量
- argument type mismatch问题解决
- 全球PML_V2陆地蒸散发与总初级生产力数据集
- MQ消息队列之RabbitMQ的安装和原理
- 【POJ】3126-Prime Path BFS、剪枝技巧
- linux路由配置秘籍,linux常用命令总结
- [Python人工智能] 二十.基于Keras+RNN的文本分类vs基于传统机器学习的文本分类
- 使用adb工具进行文件推送