转载自 hashCode到底有什么用?

hashCode概念

hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,代表了该对象在内存中的存储位置。

我们都知道hashCode()方法是顶级类Object类的提供的一个方法,所有的类都可以进行对hashCode方法重写。

我们也知道在比较一个类是否相同时往往会重写equals方法,值得注意的是,重写equals方法的同时必须也要重写hashCode方法,多次调用一个对象的hashCode方法必须返回同一个数字,这也是必须遵守的规范,不然会造必须存在的危害。

hash冲突

当两个对象equals相同,hashCode规定也必须相同,但反过来就不一定,两个对象对应一个hashCode,但equals却并不相等。。这就是传说中的hash冲突。HashMap是以hashCode取模数组形式存放值的,那两个对象hashCode一样会不会造成前一个对象的值覆盖呢?答案是不会,因为它采用了另外一种链表数据结构来解决hash冲突的情况,即使两个对象的hashCode一样,它们会放到当前数组索引位置的链表中。

hashCode设计

HashSet通过HashMap来实现的,用来存储不重复数据的,怎么判断里面的对象是否重复呢?判断对象是否重复即是判断对象里面的属性是否都一样,这时必须是重写了equals方法去比较对象的里面所有的值,而不是比较引用地址,比较引用地址它们永远都不相等,除非是同一个对象。通过equals比较的过程性能是非常不佳的,所以有了hashCode这个设计,简单两个数字的比较性equals没法比的,所以可以先通过比较对象的hashCode是否一样确定是不是同一个对象,如果hashCode不一样这时肯定就不是同一个对象,反之如果hashCode一样而且equals或者==也一样这肯定就是同一个对象。所以先比较数字的hashCode再比较equals或者==,这样效率会明显提升。

假如我们重写了equals而不重写hashCode方法,多个对象属性值一样的它们的hashCode肯定是不一样的,这时作为key在put到map中的时候,就会有多个这样的key,而达不到对象作为key的场景,同样也达不到HashSet去重的效果。

hashCode到底有什么用?相关推荐

  1. equals 和 hashCode 到底有什么联系?一文告诉你

    转载自   equals 和 hashCode 到底有什么联系?一文告诉你 写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方 ...

  2. 蚂蚁一面:hashCode 和对象的内存地址有什么关系?

    前言 先看一个最简单的打印 System.out.println(new Object()); 会输出该类的全限定类名和一串字符串: java.lang.Object@6659c656 @符号后面的是 ...

  3. 转]一个计算机专业学生几年的Java编程经验汇总

    1. 关于动态加载机制?? 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分.很多人都能背出来Java语言的特点,所谓的动态加载机制等等.当然概念往往是先记住而后消化的 ...

  4. Java 核心编程技术干货

    Java 基础篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具类篇 Java 综合篇 Java基础篇 恕我直言,在座的各位根本写不好Java! 8张图带 ...

  5. JAVA编程经验汇总 (载)

    1. 关于动态加载机制?? 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分.很多人都能背出来Java语言的特点,所谓的动态加载机制等等.当然概念往往是先记住而后消化的 ...

  6. JDK源码解析--Object类

    作为一名java开发,肯定会知道object类,object类是所有类的基类,当一个类没有直接继承任何类时,默认继承object类,所以也被称之为"上帝类". 目录 一.继承Obj ...

  7. 【规划】一个计算机专业学生几年的编程经验汇总

    [size=medium]本文转自:http://amyer.iteye.com/blog/159162 来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们, ...

  8. Java绝对好文,转载的!(转载)

    想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们,帮助大家在技术的道路上少一点弯路.说得伟大一点是希望大家为软件学院争气,其实最主要的还是大家自身的进步提 ...

  9. 一个计算机专业学生几年的Java编程经验汇总

    在javaeye上无意中发现这份转帖,对j2se,j2ee各方面都有涉及,一口气看了j2se的部分,写得挺不错的,转过来给大家分享. 一个计算机专业学生几年的Java编程经验汇总 ========== ...

最新文章

  1. 如何理解numpy.nan_to_num
  2. 期望dp ---- B. Tree Array 思维+期望dp 逆序对期望数
  3. ThreadLocal为什么要使用弱引用和内存泄露问题
  4. 利用ConcurrentHashMap来实现一个ConcurrentHashSet
  5. build vue 选哪个_分析vue-cli项目,简单修改,来快速理解这个项目的结构
  6. Asp.net采集用到的幾個方法
  7. grep 正则匹配
  8. 怎么向小学生解释欧拉公式 e^(πi)+1=0?
  9. [Vue.js] 模块化 -- 前端模块化
  10. uc手机浏览器 手机模拟_网页为何总报浏览器漏洞?起底某些手机浏览器恶意推广行为...
  11. 阶段3 2.Spring_04.Spring的常用注解_5 自动按照类型注入
  12. linux 查看gcc安装目录,linux安装GCC详解
  13. Linux的NFS(net file systen)
  14. 赵小楼《天道》《遥远的救世主》解读(84)救主文化是什么?
  15. 移动硬盘无法访问怎么办?还能恢复数据吗?
  16. 谁说手工测试不香了?25k不比二流的开发美滋滋
  17. python刷阅读_Python 刷高博客阅读量
  18. 计算机网络实验三 路由协议的配置
  19. Java必背基础词汇
  20. 哪一层提供了数据加密的功能?

热门文章

  1. [JavaWeb-Bootstrap]CSS样式和JS插件
  2. [C++11]右值和右值引用
  3. [Java基础]字节流写数据
  4. [召集令]-Dijkstra的单源最短路径算法
  5. 蓝桥杯2018初赛-哪天返回-模拟
  6. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)
  7. php mysql 子查询_php – MySQL查询和子查询
  8. android 运行在ui县城,Android基础:在UI线程中运行代码
  9. Java引用类型——强引用、软引用、弱引用和虚引用
  10. hdu 6153 A Secret kmp + dp