一:

看了一些有关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里的哈希值。相关推荐

  1. 2021-11-18哈希值

    1.哈希值 DemoHashCode.java package HashCode;/** 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实 ...

  2. 【零基础学Java】—哈希值(四十一)

    [零基础学Java]-哈希值(四十一) 一. HashSet集合的介绍 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许重复的元素 没有索引,没有带 ...

  3. 关于Java中的对象的哈希值何时相等

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7624328,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  4. Java中哈希值是怎么算的

    最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...

  5. java中string类型的哈希值是怎么计算的

    在 Java 中,字符串类型的哈希值是通过 String 类的 hashCode() 方法计算的.这个方法会通过将字符串的每个字符转换成一个整数,然后将它们进行某种数学运算来得到最终的哈希值. 具体来 ...

  6. java内存地址和哈希值_数据哈希值的计算和在table中的存储位置

    我们知道,Objects中定义了hashcode()函数,用于计算对象的哈希值.并且在很多类中都对hashcode()函数进行了覆盖.但是在HashMap中并没有直接使用各个类的hash值,而是使用h ...

  7. Java哈希值HashCode理解

    1.Object类的hashCode:返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样. 两个对象要完全相对必须哈希值一样.比较用equal() PS1:任何类均 ...

  8. [Java基础]哈希值

    哈希值:

  9. java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...

  10. 在Java里重写equals和hashCode要注意什么问题

    问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...

最新文章

  1. BZOJ 4009 接水果
  2. UVA11624大火蔓延的迷宫
  3. 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型
  4. html写登录框中的字,一个登录界面的PS设计和HTML/CSS实现
  5. Linux上安装JDK+Tomcat
  6. 2725. [Violet 6]故乡的梦(删边最短路同[TJOI2012]桥)
  7. linux防火墙允许dns服务,Linux防火墙设置-DNS服务器篇
  8. 第一次作业--四则运算
  9. “BASH: FORK: RESOURCE TEMPORARILY UNAVAILABLE”的解决方案
  10. zabbix 监控项自动发现过滤_Zabbix使用javascript+jsonpath预处理动态生成监控项
  11. Python-模块导入-63
  12. NOIP2017提高组初赛选择题解析
  13. ASM磁盘配置(udev)
  14. 【Tools】OBS Studio录制视频教程
  15. 怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个
  16. 2021年T电梯修理考试题及T电梯修理模拟考试题
  17. 【成都站报名】美团点评、蚂蚁金服、腾讯专家共论前端热点技术
  18. 刷票投票的自动运行脚本
  19. ES6—46:class中getter和setter的设置方法
  20. profix使用过程中遇到的一些问题

热门文章

  1. 致知在格物,物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后...
  2. 【信息学奥赛一本通 提高组】第三章 深搜的剪枝技巧
  3. 学习《医学三字经白话解》之医学源流+中风
  4. Dynamics CRM 365 - 零基础入门学习后端插件的调试方法
  5. 实数系的基本定理_为什么极限理论的建立需要实数理论?
  6. [Python3学习笔记-入门到入魔系列] 5分钟彻底搞懂XML文档解析
  7. 计算机为啥启用不了网络发现,Win7“网络发现”功能启用不了的原因和解决方法...
  8. windows无法开启网络发现问题解决办法(详细)
  9. linux在命令行下打开pdf文件
  10. Apache ShenYu 入门