Shell脚本 单例模式 vue组件 canal安装 haskell reflection nuget mui vue基础教程 swift视频教程 jquery的each循环 jquery去除空格 rxjava线程切换 jq入口函数 flutter 缺点 python异常 python平台 python排序 python处理json文件 java编程入门 java使用mysql java数据类型 java中的string java接口实现 atq 黑帮之地修改器 忧思华光玉 自制题库答题考试软件 html特殊符号 华为交换机学习指南 系统维护工具 mac地址修改 go2lan 疯狂java讲义 vs2003 今日头条邀请码 爱奇艺无法投屏 mac版matlab js给标签添加属性 加速软件
当前位置: 首页 > 学习教程  > 编程语言

简单理解hashMap中key相同,什么叫同一个key

2020/12/28 20:16:52 文章标签:

先说结论:做为key的对象,其hashCode相等且equals为true。(同一个对象肯定是相同,这个就不用多说了) if (p.hash hash && ((k p.key) key || (key ! null && key.equals(k))))Object类 hashCode是一…

先说结论:做为key的对象,其hashCode相等且equals为true。(同一个对象肯定是相同,这个就不用多说了)

if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))

Object类

hashCode是一个本地方法根据对象内存地址生成的一个数
equals,是地址相同的对象,即同一个对象。==必然相等

而其他类一般都重写了2者

hashCode,主要用于集合的某些操作,自己重写该方法,用于hashmap中计算数组的位置等。equals相等,则hashCode必然相等。
equals,主要是用于判断对象的字面量相同。注意是【值】相同就true。

第一种情况

定义QsmDemo 类,不重写hashCode和equals

class QsmDemo {

    private String name;
    private String identityNum;

    public QsmDemo(String name) {
        this.name = name;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdentityNum() {
        return identityNum;
    }
    public void setIdentityNum(String identityNum) {
        this.identityNum = identityNum;
    }
}

举例说明

		// 第一种情况
        Map<String, String> map = new HashMap<>();
        map.put("a", "1");
        map.put("a", "2");
        map.put("a", "3");
        System.out.println(map.size()); //1
		// 第二种情况
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put(new String("qsm"), "1");
        hashMap.put(new String("qsm"), "2");
        hashMap.put(new String("qsm"), "3");
        System.out.println(hashMap.size()); //1
		// 第三种情况
        Map<Integer, String> hashMap2 = new HashMap<>();
        hashMap2.put(new Integer(200), "1");
        hashMap2.put(new Integer(200), "2");
        hashMap2.put(new Integer(200), "3");
        System.out.println(hashMap2.size()); //1
		// 第四种情况
        Map<QsmDemo, String> hashMap3 = new HashMap<>();
        QsmDemo qsm = new QsmDemo("qsm");
        QsmDemo qsm2 = new QsmDemo("qsm");
        QsmDemo qsm3 = new QsmDemo("qsm");
        hashMap3.put(qsm, "1");
        hashMap3.put(qsm2, "2");
        hashMap3.put(qsm3, "3");
        System.out.println(hashMap3.size()); //3

第一、二和三种情况,即使加了3个,数量依然为1。原因就是,String和Integer都已经重写了hashCode方法和equals方法。以Integer为例。

    @Override
    public int hashCode() {
        return Integer.hashCode(value);
    }
    
    public static int hashCode(int value) {
      	return value;
    }
    
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

第四种,是因为QsmDemo 没有重写,而是使用原生Object的方法生成的,连hashCode都不相同,那equals就更不能为true了。
所以,这三个QsmDemo 不是相同的

第二种情况

QsmDemo 类,重写hashCode和equals


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        QsmDemo qsmDemo = (QsmDemo) o;
        return Objects.equals(name, qsmDemo.name) &&
                Objects.equals(identityNum, qsmDemo.identityNum);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, identityNum);
    }

再次运行就size全部变为1了。
因为重写了,hashCode根据2个字符串的hashCode计算得到的,equals也是对比2个字符串是不是equals。很显然,对象重写了之后就是利用字符串String自身重写的hashCode和equals方法。既然字面值都一样,那3个对象肯定都“相等”(即,hashCode相等且equals为true

所以,这个这就是key相同的简要原理了。其实还是很简单的。

【完,喜欢就点个赞呗】

正在去BAT的路上修行


本文链接: http://www.dtmao.cc/news_show_550448.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?