java里的哈希值。
一:
看了一些有关java里的哈希值的文章,有的文章把哈希值就直接叫做是内存地址,这显然是不对的,哈希值只是某一些特性像地址,但他和内存地址有着本质性的区别,压根就是两个东西。
哈希值就是:对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。更重要的是:这里的内存地址是JVM虚拟机虚拟出来的地址,并不是真实的物理内存地址。哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的(下面我们也会详细介绍怎么弄成相同的),也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。
这么说你可能还是不理解,d到底什么是逻辑上的,什么是物理上的?
那么请看一个例子:我们都知道,c++的地址是真实的物理内存地址,所以相同的输出地址的代码在不同的计算机上输出的值是不一样的,这就是物理上的地址,因为每台电脑的内存使用情况都是千差万别的,所以地址是不一样的也就不奇怪了。
但是:在java中,一段相同的代码输出的hashCode绝对是一样的。可以亲自尝试一下。
就比如:System.out.println("hello".hashCode());//哈希码为99162322,我用的IDEA编译器,可能和软件也有点关系。
这就说明一个问题:java里的hashCode只是逻辑上的,是我们jvm虚拟机通过特定的算法计算出来的,所以每台电脑上相同的语句的hashCode都是一样的, 这就是逻辑上的。
哈希值的一大作用就是:查重和去重。例如我们的Set集合就用到了hashCode来防止对象出现重复。
二:
1.String类的hashCode
// str1和str3的字符串相同。String str1="张三";String str2="李四";String str3="张三";System.out.println(str1.hashCode());//774889System.out.println(str2.hashCode());//842061System.out.println(str3.hashCode());//774889//可以看出,只要是字符串相同,hashCode也相同
但是情况一定是这样的吗?
答案是否定的,因为哈希冲突。
System.out.println("重地".hashCode());//1179395System.out.println("通话".hashCode());//1179395可以看出,出现了字符串不同但是哈希值依然相同的情况,这说明比较字符串的内容还是equals更加可靠,只比较hashCode是不太靠谱的。
2.Integer类的hashCode:返回的哈希码就是Integer对象里所包含的那个整数的数值。
Integer i=1;System.out.println(i.hashCode()); // hashCode的值为1,就是原来的数字
三: 如何重写hashCode()函数
先看一个例子,定义一个学生类,包含两个变量(name和age)
student stu1=new student("张三",18);student stu2=new student("张三",18);System.out.println(stu1.hashCode());//1329552164System.out.println(stu2.hashCode());//363771819
我们发现:内容完全相同的两个对象的hashCode值却不一样,这很好理解,这就是我们学生类中的的hashCode未被重写,导致比较的时候不是按那两个变量的实际内容比较的。
那么如何重写hashCode函数哪?
package collection;public class student {
String name;
int age;public student() {}public student(String name, int age) {this.name = name;this.age = age;}//重写hashCode函数,系统自动生成的@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}
}
那么再运行一次,会发现两个对象的hashCode又相同了。这就能通过比较自定义对象的hashCode来比较自定义对象是否相同了。
student stu1=new student("张三",18);student stu2=new student("张三",18);System.out.println(stu1.hashCode());//24021577System.out.println(stu2.hashCode());//24021577
补充:equals函数的重写
之前以及说过了,equals也是比较用的。那我们想要用equals来比较自定义对象的话就得重写equals函数。
@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;student student = (student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name == null;}
java里的哈希值。相关推荐
- 2021-11-18哈希值
1.哈希值 DemoHashCode.java package HashCode;/** 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实 ...
- 【零基础学Java】—哈希值(四十一)
[零基础学Java]-哈希值(四十一) 一. HashSet集合的介绍 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许重复的元素 没有索引,没有带 ...
- 关于Java中的对象的哈希值何时相等
本文出处:http://blog.csdn.net/chaijunkun/article/details/7624328,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...
- Java中哈希值是怎么算的
最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...
- java中string类型的哈希值是怎么计算的
在 Java 中,字符串类型的哈希值是通过 String 类的 hashCode() 方法计算的.这个方法会通过将字符串的每个字符转换成一个整数,然后将它们进行某种数学运算来得到最终的哈希值. 具体来 ...
- java内存地址和哈希值_数据哈希值的计算和在table中的存储位置
我们知道,Objects中定义了hashcode()函数,用于计算对象的哈希值.并且在很多类中都对hashcode()函数进行了覆盖.但是在HashMap中并没有直接使用各个类的hash值,而是使用h ...
- Java哈希值HashCode理解
1.Object类的hashCode:返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样. 两个对象要完全相对必须哈希值一样.比较用equal() PS1:任何类均 ...
- [Java基础]哈希值
哈希值:
- java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...
上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...
- 在Java里重写equals和hashCode要注意什么问题
问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...
最新文章
- BZOJ 4009 接水果
- UVA11624大火蔓延的迷宫
- 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型
- html写登录框中的字,一个登录界面的PS设计和HTML/CSS实现
- Linux上安装JDK+Tomcat
- 2725. [Violet 6]故乡的梦(删边最短路同[TJOI2012]桥)
- linux防火墙允许dns服务,Linux防火墙设置-DNS服务器篇
- 第一次作业--四则运算
- “BASH: FORK: RESOURCE TEMPORARILY UNAVAILABLE”的解决方案
- zabbix 监控项自动发现过滤_Zabbix使用javascript+jsonpath预处理动态生成监控项
- Python-模块导入-63
- NOIP2017提高组初赛选择题解析
- ASM磁盘配置(udev)
- 【Tools】OBS Studio录制视频教程
- 怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个
- 2021年T电梯修理考试题及T电梯修理模拟考试题
- 【成都站报名】美团点评、蚂蚁金服、腾讯专家共论前端热点技术
- 刷票投票的自动运行脚本
- ES6—46:class中getter和setter的设置方法
- profix使用过程中遇到的一些问题
热门文章
- 致知在格物,物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后...
- 【信息学奥赛一本通 提高组】第三章 深搜的剪枝技巧
- 学习《医学三字经白话解》之医学源流+中风
- Dynamics CRM 365 - 零基础入门学习后端插件的调试方法
- 实数系的基本定理_为什么极限理论的建立需要实数理论?
- [Python3学习笔记-入门到入魔系列] 5分钟彻底搞懂XML文档解析
- 计算机为啥启用不了网络发现,Win7“网络发现”功能启用不了的原因和解决方法...
- windows无法开启网络发现问题解决办法(详细)
- linux在命令行下打开pdf文件
- Apache ShenYu 入门