zoukankan      html  css  js  c++  java
  • java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)

    由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖。

    不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法,应该就相当于c++重载==运算符来保证能判断是否相等。只不过java没有自定义重载运算符这个功能的,需要进行方法覆盖。

    equals的方法原型是 boolean equals(Object o);注意括号内,因为是继承自Object类,覆盖的是超类的方法。hashCode的方法原型就是int hashCode();

    先看一段代码:

    import java.util.*;
    class Pair<V,K>{
        V first;
        K second;
        public Pair() {first = null;second = null;}
        public Pair(V f,K s){
            first = f;
            second = s;
        }
    //    public boolean equals(Object o) {
    //        if(!(o instanceof Pair))
    //        {
    //            return false;
    //        }
    //        Pair<V,K> pn = (Pair<V,K>)o;
    //        return pn.first.equals(first) && pn.second.equals(second);
    //    }
    //    public int hashCode() {
    //        return first.hashCode() + second.hashCode();
    //    }
    }
    public class Main {
        
        public static void main(String[] args) {
            Pair<String,String> p = new Pair<>("a","b");
            Pair<String,String> q = new Pair<>("a","b");
            System.out.println(p.equals(q));
            System.out.println(p.hashCode() + " " + q.hashCode());
            Map<Pair<String,String>,Integer> map = new HashMap();
            map.put(p, 1);
            System.out.println(map.containsKey(q));
            map.put(q, 2);
            for(Pair<String,String> key : map.keySet()) {
                System.out.println(map.get(key));
            }
        }
    }

    这段代码把覆盖重写的两个方法给注释掉了,然后判断了值相同的两个Pair对象p和q是否相等,并输出了他们的hashCode,同时把p放进建立的HashMap中,用q来判断p是否存在,再把q放入,并遍历map的values。答案是:

    false
    2018699554 1311053135
    false
    1
    2

    然后:

    import java.util.*;
    class Pair<V,K>{
        V first;
        K second;
        public Pair() {first = null;second = null;}
        public Pair(V f,K s){
            first = f;
            second = s;
        }
        public boolean equals(Object o) {
            if(!(o instanceof Pair))
            {
                return false;
            }
            Pair<V,K> pn = (Pair<V,K>)o;
            return pn.first.equals(first) && pn.second.equals(second);
        }
        public int hashCode() {
            return first.hashCode() + second.hashCode();
        }
    }
    public class Main {
        
        public static void main(String[] args) {
            Pair<String,String> p = new Pair<>("a","b");
            Pair<String,String> q = new Pair<>("a","b");
            System.out.println(p.equals(q));
            System.out.println(p.hashCode() + " " + q.hashCode());
            Map<Pair<String,String>,Integer> map = new HashMap();
            map.put(p, 1);
            System.out.println(map.containsKey(q));
            map.put(q, 2);
            for(Pair<String,String> key : map.keySet()) {
                System.out.println(map.get(key));
            }
        }
    }

    然后把注释去掉之后的结果是:

    true
    195 195
    true
    2

    虽然说这里的hashCode重写的没有什么道理,但是至少值相同的两个对象他们的hashCode是相同的,这样在HashMap中第一关判断hashCode是否相同就过了,接着再遍历判断是否有值相同的元素,可以判断是否含有某个键值,并更新键值的value等等。

    而且要注意equals的覆盖,参数列表不可以因为是对于Pair对象的判断就改成Pair p,这样只是重载了并不是覆盖。

  • 相关阅读:
    jQuery遍历div,判断是否为空,为空时执行某个操作
    ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法
    PS中缩放工具的细微缩放不可以使用的解决方法
    Excel的基础操作
    Word文档编辑
    人脸识别活体检测之张张嘴和眨眨眼——login.jsp
    人脸识别活体检测之张张嘴和眨眨眼——web.xml
    人脸识别活体检测之张张嘴和眨眨眼——readme
    maven用途、核心概念、用法、常用参数和命令、扩展
    [转载]ORACLE临时表的创建
  • 原文地址:https://www.cnblogs.com/8023spz/p/9392405.html
Copyright © 2011-2022 走看看