总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。

前者集合内的元素是有序的,元素可以重复;

后者元素无序,但元素不可重复。

要想保证元素不重复,可两个元素是否重复应该依据Object.equals方法来判断。

如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。

也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。

于是,Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。

当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。

如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,

就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。  所以这里存在一个冲突解决的问题。

这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

Java对于eqauls方法和hashCode方法是这样规定的:

1、如果两个对象相同,那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同。

hashcode这个方法是用来鉴定2个对象是否相等的。

一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等 了。

简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。

举个例子,有个学生类,属性只有姓名和性别,那么我们可以 认为只要姓名和性别相等,那么就说这2个对象是相等的。

简单来讲,hashcode相 当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。

我们一般在覆盖equals的同时也要 覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,

那么hashcode的方法也要返回姓名 的hashcode值加上性别的hashcode值,

这样从逻辑上,他们就一致了。 要从物理上判断2个对象是否相等,用==就可以了。

转载于:https://www.cnblogs.com/shy1766IT/p/3337266.html

java的HashCode方法相关推荐

  1. Java Object.hashCode()方法

    Java Object.hashCode()方法 @(JAVA)[java] 更详细的内容可以参考<effective java>与<think in java> Object ...

  2. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

  3. java重写hashcode方法代码_Java重写hashcode方法

    覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个 覆写hashcode 1. 把某个非零常数值 ...

  4. java中hashCode方法与equals方法的用法

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  5. Java重写hashcode方法

    1.先初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17; 2.选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算: (1) 如果是boolean值 ...

  6. java中equals方法的参数_equals方法的参数必须为Object类型的引用变量

    核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...

  7. JAVA中重写equals()方法的同时要重写hashcode()方法

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  8. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  9. Java基础提升篇:equals()与hashCode()方法详解

    概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...

  10. 深入理解Java的equals和hashCode方法

    1.谈谈equals方法 相信大家对这个这个方法一定不陌生.该方法是Object基类里的非final方法(被设计成可覆盖的),下面我们来看看Object中是如何实现该方法的.源代码如下: public ...

最新文章

  1. 【学习笔记】超简单的多项式求逆(含全套证明)
  2. python真的超过java了吗-Python 的开发效率真的比 Java高吗?
  3. javax.mail 发送
  4. AES加密算法的详细简介
  5. python二维列表写入excel_用Python实现合并excel列表
  6. Softmax Derivation
  7. python爬虫股票数据分析判断股票好坏_教你用Python爬虫股票评论,简单分析股民用户情绪...
  8. 2016年第七届(C/C++)B组蓝桥国赛题
  9. 程序员到创业,成长之路的技能分享
  10. Python基础(8)字符串及常用操作
  11. C++转erlang后感想
  12. 文华财经wh6如何导入需要的指标
  13. 专访李果:初生牛犊不怕虎的移动创业者
  14. mysql-mmm架构深度详解
  15. ES6(ES2015)
  16. PHY--PUSCH
  17. 阿里云产品有哪些?阿里云产品种类整理汇总
  18. nuke linux 插件,NUKE插件:通过环境变量设置NUKE GIZMO插件
  19. SE 的 ONNX 图
  20. java用tkmapper分组查询_tk.mybatis 中的通用Mapper自定义SQL语句

热门文章

  1. 为什么基于接口而非实现编程?
  2. redis面试题简义
  3. “最快3个月复制支付宝的核心能力” 解密蚂蚁金服bPaaS
  4. Ansible之roles使用
  5. 如何用TensorFlow生成令人惊艳的分形图案
  6. 什么是:before和:after?
  7. VMware 虚拟机桥接网络设置
  8. innodb_force_recovery
  9. 陶哲轩实分析 习题 12.5.4,12.5.5
  10. 十二客推出新版邮箱批量注册