hashCode作用可以归结为:加速查找速度

hashCoed 的特性

(1)HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址;

(2)如果两个对象相同, equals方法一定返回true,并且这两个对象的HashCode一定相同;

(3)两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能够说明这两个对象在一个散列存储结构中。

(4)如果对象的equals方法被重写,那么对象的HashCode也尽量重写。

equals()方法与 “=="号 的区别

1、超类Object的equals()底层原理:

在超类Object中有一个equals()的基本方法,源码如下:

public boolean equals(Object obj) { return (this == obj); }

实际上我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较的是两个对象的内存地址,在Object的equals方法底层调用的是==号,所以说Object的equals()方法是比较两个对象的内存地址是否相等,如果为true,则表示的引用的是同一个对象。

2、equals()与"==" 的区别:

(1)== 号在比较基本数据类型时比较的是数据的值,而用 == 号比较两个对象时比较的是两个对象的地址值;

(2)equals()不能用于基本的数据类型,对于基本的数据类型要用其包装类。

(3)默认情况下,也就是从Object继承而来的 equals 方法与 “==” 是完全等价的,比较的都是对象的内存地址,因为底层调用的是 “==” 号,但我们可以重写equals方法,使其按照我们的需求方式进行比较,如String类重写equala()方法,使其比较的是字符的内容,而不再是内存地址。

hashCode 的作用

Java中的集合有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 equals方法可用于保证元素不重复,但如果每增加一个元素就检查一次,若集合中现在已经有1000个元素,那么第1001个元素加入集合时,就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。

哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。这样一来,当集合要添加新的元素时,先调用这个元素的HashCode方法,就一下子能定位到它应该放置的物理位置上。

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

(2)如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了;

(3)不相同的话,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起。这样一来实际调用equals方法的次数就大大降低了。

所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。

java双等号和equals_JAVA编程基础篇:hashCode的特性和作用相关推荐

  1. java双等号和equals_Java中的 equals和双等号,你懂吗?

    点击蓝色"程序员的时光 "关注我 ,标注"星标",及时阅读最新技术文章! 在说equals方法与"=="之前,我们先来回顾一下Java中的数 ...

  2. Python学习之旅(核心编程基础篇003运算符)

    Python学习之旅 Python核心编程基础篇2020.12.18 一.算数运算符 二.比较运算符 三.赋值运算符 四.逻辑运算符 五.成员运算符 六.身份运算符 七.三目运算符 八.运算符优先级 ...

  3. Python编程基础篇

    python编程基础篇之第二节环境搭建和软件安装 文章目录 python编程基础篇之第二节环境搭建和软件安装 前言 一.python介绍 1. python简介 2. python的应用方向 3. p ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. [内核编程] 内核环境及其特殊性,驱动编程基础篇

    [内核编程] 内核环境及其特殊性,驱动编程基础篇  在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...

  6. java 双等号(==) 与equals方法的介绍和区别

    java 双等号(==) 与equals方法的介绍和区别 1.基本数据类型与equals方法 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Ob ...

  7. java 双等号(==) 与equals方法的使用区别

    java 双等号(==) 与equals方法的区别 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Object类中比较的也是地址,因为在低层也是 ...

  8. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  9. Java全链路复习面经-基础篇(2.5万字全文)

    序言 主要分为两篇,一篇基础篇,涵盖Java基础,数据库,JVM,计算机网络等知识 另一篇为框架篇,主要为流行框架,如Spring.SpringMVC.Mybatis.SpringBoot.Sprin ...

最新文章

  1. Simple File System
  2. isnull的使用方法
  3. 深入探究.Net Core Configuration读取配置的优先级
  4. 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
  5. 二维map —— HDU1263
  6. 27.用zxing生成二维码
  7. 想从事 DBA 工作,该挑选哪一款数据库产品【转载+整理】
  8. 《C语言及程序设计》实践参考——太乐了
  9. gdb在cygwin下的安装
  10. 【转】Tapestry5和Eclipse的整合
  11. Ubuntu 链接ln的使用:创建和删除符号链接
  12. python利用有道词典翻译_Python调用有道词典翻译
  13. 2030年中国GDP将超越美国成为世界第一?
  14. stm32单片机按键消抖、长按、多击终极解决方案
  15. 3 Robotics: Mobility 课程学习记录及课后习题解答
  16. openwrt路由器(红米AC2100)折腾全程——多拨、ipv6负载均衡、ipv6 nat6、ddns、端口转发
  17. CSS W3C 统一验证工具和压缩
  18. Linux基础教程 (第二版) 第2版
  19. [数据挖掘笔记] 聚类算法KMeans
  20. cleanup(cleanup什么意思中文)

热门文章

  1. redis3集群部署
  2. 大剑无锋之Hive调优【面试推荐】
  3. leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
  4. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  5. 【Python Flask】使用Ajax从后台请求数据
  6. 在java 8 stream表达式中实现if/else逻辑
  7. Libra教程之:执行Transactions
  8. Spring Cloud OpenFeign使用教程
  9. JVM系列之内存泄漏
  10. 案例4-1.6 树种统计 (25 分)_18行代码AC