hashCode 和 equals 的区别
今天记录一下hashCode的知识,以前都没有怎么接触过的,感觉还是很陌生,专门去学习了一下
首先我最大的问题就是hashCode究竟是干什么 的,现在也一知半解了吧,
哈希值是一个对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址。而hashCode()就是寻找哈希值的一个方法
那又要为什么要有这个hashCode() 呢?
为了减少equals()的使用次数,提高执行效率(说的比较不全面,但自己能理解就好,下面通过具体讲解就通了)
hashCode() 和 equals()方法的作用(分为两种情况)
1、如果类中不重写他们:
hashCode():返回对象的地址值
equals(): 比较两个值的地址
2、如果类中重写了:
hashCode(): 根据对象的成员变量,返回一个整数
equals():比较两个值是否相等
hashCode 和 equals 重写后比较两个对象是否相等
如果两个对象比较的equals()相等,那么这两个对象的hashCode()肯定相等,就是说equals()是绝对靠谱的
如果两个对象比较的hashCode()相等,那么equals()去做比较却不一定相等,就是说hashCode()不是绝对可靠的
通过hashCode()和 equals()搭配是如何提高效率的
对于一个对象中有大量的成员信息,只用equals()比较效率会比较低
可以先通过hashCode() 比较,如果不相等,则两个对象一定不同,如果相等,那就用equals()进行比较,这样hashCode()方法可以给我们比较出大部分对象的比较,从而提高效率
最后讲讲他们两个搭配的应用
HashSet集合都知道吧,它的特点就是无序,元素唯一,主要靠的就是重写hashCode()和equals()方法:
下面用代码演示:
1 //建立JavaBean
2 import java.util.Objects;
3
4 public class HashSetTest {
5 private String name;
6 private int age;
7 public String getName() {
8 return name;
9 }
10 public void setName(String name) {
11 this.name = name;
12 }
13 public int getAge() {
14 return age;
15 }
16 public void setAge(int age) {
17 this.age = age;
18 }
19 public HashSetTest(String name, int age) {
20 this.name = name;
21 this.age = age;
22 }
23 @Override
24 public String toString() {
25 return "HashSetTest{" +
26 "name='" + name + '\'' +
27 ", age=" + age +
28 '}';
29 }
30 public HashSetTest() {
31 }
32 // 重写equals()和hashCode()方法
33 @Override
34 public boolean equals(Object o) {
35 if (this == o) return true;
36 if (o == null || getClass() != o.getClass()) return false;
37 HashSetTest that = (HashSetTest) o;
38 return age == that.age &&
39 Objects.equals(name, that.name);
40 }
41 @Override
42 public int hashCode() {
43 return Objects.hash(name, age);
44 }
45 }
测试代码:
1 import java.util.HashSet;
2 import java.util.Iterator;
3
4 public class HashSetTest1 {
5 public static void main(String[] args) {
6 HashSetTest hashSetTest = new HashSetTest("张三",12);
7 HashSetTest hashSetTest1 = new HashSetTest("李四",34);
8 HashSetTest hashSetTest2 =new HashSetTest("张三",12);//定义一个前面出现过的对象,那么后面就不会加入到hashSet集合中
9 HashSet<HashSetTest> hashSet = new HashSet<>();
10 //添加对象到hashSet集合中,此时就会调用hashCode和equals方法
11 hashSet.add(hashSetTest);
12 hashSet.add(hashSetTest1);
13 hashSet.add(hashSetTest2);
14 //遍历hashSet集合
15 Iterator iterator =hashSet.iterator();
16 while (iterator.hasNext()){
17 System.out.println(iterator.next());
18 }
19 }
20 }
输出结果:

谢谢大家,今天就讲到这里了,如有错误望及时提出来哦
hashCode 和 equals 的区别的更多相关文章
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- hashCode和equals的区别
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写has ...
- [转载] HashMap的工作原理-hashcode和equals的区别
目录 前言 为什么需要使用Hashcode,可以从Java集合的常用需求来描述: 更深入的介绍 先来些简单的问题 HashMap的0.75负载因子 总结 我在网上看到的这篇文章,介绍的很不错,但是我看 ...
- hashCode与equals的区别与联系
一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...
- !!转!!hashCode与equals的区别与联系
这篇文章写得很好!!! 原文链接:http://blog.csdn.net/afgasdg/article/details/6889383 一.equals方法的作用 1.默认情况(没有覆盖equal ...
- 《基础知识》hashCode与equals的区别与联系
一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...
- hashCode 及hashcode与equals的区别
1.hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解请 参考 [1] public int hashCode()返回该对象的哈希码值.支持此方法是为了提高哈 ...
- (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节
背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...
- hashCode与equals的作用与区别及应当注意的细节
最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的,所以决定把它们研究一下. 以前写程序一直没有注意hashCode的作用 ...
随机推荐
- zzcms2020代码审计笔记
在CNVD中看到zzcms后台sql注入漏洞: 漏洞细节未被公开,影响版本zzcms2020,本地搭建一套相同版本找一下漏洞触发点. 打开目录,后台ba***.php文件共有三个: 先看下bad.ph ...
- VRRP的基本配置
一.实验拓扑 二.实验编址 三.实验步骤: 1.设置PC的IP等信息 2.启动设备(全选) 3.设置路由器端口ip 4. 配置ospf网络 查看: 5.配置VRRP协议 配置完成后查看: 6.验证主备 ...
- MySQL自定义函数与存储过程的创建、使用、删除
前言 日常开发中,可能会用到数据库的自定义函数/存储过程,本文记录MySQL对自定义函数与存储过程的创建.使用.删除的使用 通用语法 事实上,可以认为存储过程就是没有返回值的函数,创建/使用/删除都非 ...
- 题解—God Knows
考场上以为就是转化成一个无向图然后以为无向图有什么性质可以搞出来来着. 果然应验了那句话,一个思路想太久想不出来一般是假的. 所以这种一看就需要转化的题要多尝试能往哪转化,而不是按住一个思路不动. 只 ...
- shell脚本基本使用教程
sh脚本的固定第一行 #!/bin/bash 变量 #!/bin/bash var1=1 var2=2 var3=$[var1+var2] echo "$var3" 传达参数 sh ...
- 详解 OpenGL ES 2.x 渲染流程
khronos官方对OpenGL ES的描述如下: OpenGL ES is a royalty-free, cross-platform API for rendering advanced 2D ...
- 如何修改leaflet的marker图标
1. 从官网中查看对应文档:https://leafletjs.com/ 2. 3. var greenIcon = L.icon({ iconUrl: 'leaf-green.png', shado ...
- spring AOP事务
1 <bean id="tttt" class="com.ry.project.dataSouces.UserLogger"/> 2 <aop ...
- RabbitMQ(二):交换机
前言 学习自bili尚硅谷-RabbitMQ 发布确认 之前的消息应答,队列持久化是为了保证 -> 消息从rabbitmq队列到消费者的过程中不会丢失:消息持久化则是为了保证 -> 消息从 ...
- BeanUtils基本使用方法与原理
使用BeanUtils的原因 因为setProperty是JSP中的标签,因此使用model 2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Serv ...