首页 > 其他分享 >通过 Demo 理解 hashCode 与 equals 的关系

通过 Demo 理解 hashCode 与 equals 的关系

时间:2023-06-06 17:05:36浏览次数:42  
标签:MyEqualsDemo demo equals hashCode field Demo heatdeath com


package com.heatdeath.object;

import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * Author:  heatdeath
 * Date:    2018/4/19
 * Desc:
 */
@Slf4j
public class EqualsDemo {

    public static void main(String[] args) {
        MyEqualsDemo demo_1 = new MyEqualsDemo("111", "111");
        MyEqualsDemo demo_2 = new MyEqualsDemo("222", "222");
        MyEqualsDemo demo_3 = new MyEqualsDemo("111", "111");

        log.info("demo_1 hashcode is {}", demo_1.hashCode());
        log.info("demo_2 hashcode is {}", demo_2.hashCode());
        log.info("demo_3 hashcode is {}", demo_3.hashCode());

        log.info("demo_1 toString is {}", demo_1.toString());
        log.info("demo_2 toString is {}", demo_2.toString());
        log.info("demo_3 toString is {}", demo_3.toString());

        log.info("demo_1 == demo_3 result is {}", demo_1 == demo_3);    // False
        log.info("demo_1.equals(demo_3) result is {}", demo_1.equals(demo_3));  // True

        log.info("-----------------------------------------------------");

//        Map<MyEqualsDemo, String> map = new HashMap<>();
//        map.put(demo_1, "demo_1");
//        log.info("map.get(demo_1) is {}", map.get(demo_1));
//
//        demo_1.setField_1("change field_1");
//        log.info("now demo_1 hashcode is {}", demo_1.hashCode());
//        log.info("map.get(demo_1) is {}", map.get(demo_1));
//
//        Map<int, String> map1 = new HashMap<>();
//        Map<String, int> map2 = new HashMap<>();

    }
}

class MyEqualsDemo {
    private String field_1;

    private String field_2;

    public MyEqualsDemo(String field_1, String field_2) {
        this.field_1 = field_1;
        this.field_2 = field_2;
    }

    public String getField_1() {
        return field_1;
    }

    public void setField_1(String field_1) {
        this.field_1 = field_1;
    }

    public String getField_2() {
        return field_2;
    }

    public void setField_2(String field_2) {
        this.field_2 = field_2;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyEqualsDemo that = (MyEqualsDemo) o;

        return (field_1 != null ? field_1.equals(that.field_1) : that.field_1 == null) && (field_2 != null ? field_2.equals(that.field_2) : that.field_2 == null);
    }

    @Override
    public int hashCode() {
        int result = field_1 != null ? field_1.hashCode() : 0;
        result = 31 * result + (field_2 != null ? field_2.hashCode() : 0);
        return result;
    }
}

21:33:30.309 [main] INFO com.heatdeath.object.EqualsDemo - demo_1 hashcode is 1557024
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_2 hashcode is 1588800
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_3 hashcode is 1557024
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_1 toString is com.heatdeath.object.MyEqualsDemo@17c220
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_2 toString is com.heatdeath.object.MyEqualsDemo@183e40
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_3 toString is com.heatdeath.object.MyEqualsDemo@17c220
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_1 == demo_3 result is false
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - demo_1.equals(demo_3) result is true
21:33:30.322 [main] INFO com.heatdeath.object.EqualsDemo - -----------------------------------------------------

结论:

1、如果 demo_1.equals(demo_3) 为 true,则 demo_1 与 demo_3 的 hashCode 必定相同

2、如果两个对象的 hashCode 相同,但 equals() 不一定返回 true

3、 equals 比较的是对象的内容, == 比较的是引用类型数据所指向堆中对象的地址


这个是别人的结论,好像比我的更精炼一些…

1)对于 == 关系操作符,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于 equals 方法,注意: equals 方法不能作用于基本数据类型的变量

如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如 String、Date 等类对 equals 方法进行了重写的话,比较的是所指向的对象的内容。



标签:MyEqualsDemo,demo,equals,hashCode,field,Demo,heatdeath,com
From: https://blog.51cto.com/u_16152603/6426046

相关文章

  • ==和equals的区别
    在JAVA中,==与equals都有比较判断对象是否相等的作用,但具体用法却并不相同。==是运算符号,而equals则属于方法。当==两边的对象属于基本类型时,==的作用仅是比较对象的值是否相等,如果相等返回true,否则返回false;当两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一......
  • 你还在用Object.equals()方法吗?
    前言当《阿里巴巴Java开发手册》发布后,我也是仔细进行了阅读,想从中找出一些“标准”,让自己的代码质量提高。手册中对Object的equals方法的使用进行了强制,而且推荐使用JDK7中工具类Objects的equals方法,至此之后我就很少使用Object.equals()方法了。一、Java开发手册......
  • chatglm_langchain_demo
    #Setupenvirnmentcondacreate-nlangchainpython=3.8.1-ycondaactivatelangchain#拉取仓库gitclonehttps://github.com/imClumsyPanda/langchain-ChatGLM.git#安装依赖cdlangchain-ChatGLMpython3-mpipinstall-rrequirements.txtpython3-mpipinstal......
  • java中equals与matches区别
    matches:判断字符是否与指定的正则表达式相匹配equals:判断二个字符串是否相等举例:1.看例题https://www.nowcoder.com/share/jump/3295745116860251147252.看例题https://www.nowcoder.com/share/jump/329574511686025148552总结:一个是判断是否符合正则表达式规则,另一个是判断是......
  • demo测试
    1.测试测试{"code":200,"msg":"","data":{"id":23,"userId":17,"name":"demo1","content":"发的范德萨范德萨分",......
  • C# 中==与Equals方法比较
    先来段代码,如下:staticvoidMain(string[]args){stringa=newstring(newchar[]{'h','e','l','l','o'});stringb=newstring(newchar[]{'h','e',&......
  • bloomFilter_demo
    参考博客:(14条消息)布隆(BloomFilter)过滤器入门_布隆过滤器入门_qq_39093474的博客-CSDN博客5分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!-知乎(zhihu.com)BloomFilterTest.javapackagecom.hmb;importcom.google.common.hash.BloomFilter;importcom.google.co......
  • netty入门demo
    参考博客:(14条消息)【Netty整理01-快速入门】Netty简单使用Demo(已验证)_the_fool_的博客-CSDN博客ServerHandler.javapackagecom.hmb;importio.netty.buffer.ByteBuf;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.ChannelInboundHandlerAdapt......
  • 异步爬虫demo2
    importreimportaiohttpimportasyncioclassAsyn:def__init__(self):self.__headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/112.0.0.0Safari/537......
  • EasyCVR使用SDK接入,设备全部离线,但是SDK DEMO接入正常是什么原因?
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持多协议、多类型的设备接入,包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。有用户反馈,EasyCVR平台中,使用SDK接入的设备显示......