今天记录一下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 的区别的更多相关文章

  1. java中hashcode和equals的区别和联系

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  2. hashCode和equals的区别

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写has ...

  3. [转载] HashMap的工作原理-hashcode和equals的区别

    目录 前言 为什么需要使用Hashcode,可以从Java集合的常用需求来描述: 更深入的介绍 先来些简单的问题 HashMap的0.75负载因子 总结 我在网上看到的这篇文章,介绍的很不错,但是我看 ...

  4. hashCode与equals的区别与联系

    一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...

  5. !!转!!hashCode与equals的区别与联系

    这篇文章写得很好!!! 原文链接:http://blog.csdn.net/afgasdg/article/details/6889383 一.equals方法的作用 1.默认情况(没有覆盖equal ...

  6. 《基础知识》hashCode与equals的区别与联系

    一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...

  7. hashCode 及hashcode与equals的区别

    1.hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解请 参考 [1]  public int hashCode()返回该对象的哈希码值.支持此方法是为了提高哈 ...

  8. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  9. hashCode与equals的作用与区别及应当注意的细节

    最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的,所以决定把它们研究一下. 以前写程序一直没有注意hashCode的作用 ...

随机推荐

  1. JavaSE-方法

    何谓方法 比如之前用到的 System.out.println(); System为一个类:out为这个类的一个输出对象:println()为这个对象的方法 调用System类中out输出对象的pri ...

  2. minio-对象存储

    1. 简介 官方地址 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件. ...

  3. 软件开发目录规范 ATM框架构建

    软件开发的目录规范 建立文件夹 为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要.软件的目录规范并无硬性标准,只要清晰可读即可 以ATM购物车项目为例: 首 ...

  4. mzy git学习,初识git(一)

    GIT学习 git工作区.暂存区.本地库.远程库 工作区:实际上我们工作的地方,进行写代码或者文件的地方. 暂存区:我们执行了git add 操作之后,就会被提交到暂存区. 本地库:其实最后我们需要执 ...

  5. 工作多年后再来聊聊IO

    IO模型 IO是Input/Output的缩写.Linix网络编程中有五种IO模型: blocking IO(阻塞IO) nonblocking IO(非阻塞IO) IO multiplexing(多 ...

  6. ARP协议工作原理实验

    一.实验目的 验证"在向目的主机发送数据包时会先查询ARP高速缓存,如果ARP高速缓存中已保存了目的主机的MAC地址,不进行ARP查询,使用ARP高速缓存中的MAC地址:如果缓存中没有IP对 ...

  7. Spring系列之事物是如何管理的

    前言 我们都知道Spring给我们提供了很多抽象,比如我们在操作数据库的过程中,它为我们提供了事物方面的抽象,让我们可以非常方便的以事物方式操作数据库.不管你用JDBC.Mybatis.Hiberna ...

  8. Django的form组件——正则校验

    from django.contrib import admin from django.urls import path from app01 import views urlpatterns = ...

  9. SAR总结

    1.星载InSAR技术简介 星载合成孔径雷达干涉测量(InSAR)是一种用于大地测量和遥感的雷达技术.InSAR使用两个或多个SAR图像,利用返回卫星的波的相位差来计算目标地区的地形.地貌以及表面的微 ...

  10. Mysql常用sql语句(11)- between and 范围查询

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 between and可以判断值是否在指定范围内 ...