java双等号和equals_JAVA编程基础篇:hashCode的特性和作用
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的特性和作用相关推荐
- java双等号和equals_Java中的 equals和双等号,你懂吗?
点击蓝色"程序员的时光 "关注我 ,标注"星标",及时阅读最新技术文章! 在说equals方法与"=="之前,我们先来回顾一下Java中的数 ...
- Python学习之旅(核心编程基础篇003运算符)
Python学习之旅 Python核心编程基础篇2020.12.18 一.算数运算符 二.比较运算符 三.赋值运算符 四.逻辑运算符 五.成员运算符 六.身份运算符 七.三目运算符 八.运算符优先级 ...
- Python编程基础篇
python编程基础篇之第二节环境搭建和软件安装 文章目录 python编程基础篇之第二节环境搭建和软件安装 前言 一.python介绍 1. python简介 2. python的应用方向 3. p ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- [内核编程] 内核环境及其特殊性,驱动编程基础篇
[内核编程] 内核环境及其特殊性,驱动编程基础篇 在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...
- java 双等号(==) 与equals方法的介绍和区别
java 双等号(==) 与equals方法的介绍和区别 1.基本数据类型与equals方法 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Ob ...
- java 双等号(==) 与equals方法的使用区别
java 双等号(==) 与equals方法的区别 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Object类中比较的也是地址,因为在低层也是 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- Java全链路复习面经-基础篇(2.5万字全文)
序言 主要分为两篇,一篇基础篇,涵盖Java基础,数据库,JVM,计算机网络等知识 另一篇为框架篇,主要为流行框架,如Spring.SpringMVC.Mybatis.SpringBoot.Sprin ...
最新文章
- Simple File System
- isnull的使用方法
- 深入探究.Net Core Configuration读取配置的优先级
- 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
- 二维map —— HDU1263
- 27.用zxing生成二维码
- 想从事 DBA 工作,该挑选哪一款数据库产品【转载+整理】
- 《C语言及程序设计》实践参考——太乐了
- gdb在cygwin下的安装
- 【转】Tapestry5和Eclipse的整合
- Ubuntu 链接ln的使用:创建和删除符号链接
- python利用有道词典翻译_Python调用有道词典翻译
- 2030年中国GDP将超越美国成为世界第一?
- stm32单片机按键消抖、长按、多击终极解决方案
- 3 Robotics: Mobility 课程学习记录及课后习题解答
- openwrt路由器(红米AC2100)折腾全程——多拨、ipv6负载均衡、ipv6 nat6、ddns、端口转发
- CSS W3C 统一验证工具和压缩
- Linux基础教程 (第二版) 第2版
- [数据挖掘笔记] 聚类算法KMeans
- cleanup(cleanup什么意思中文)
热门文章
- redis3集群部署
- 大剑无锋之Hive调优【面试推荐】
- leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
- leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
- 【Python Flask】使用Ajax从后台请求数据
- 在java 8 stream表达式中实现if/else逻辑
- Libra教程之:执行Transactions
- Spring Cloud OpenFeign使用教程
- JVM系列之内存泄漏
- 案例4-1.6 树种统计 (25 分)_18行代码AC