深入理解java中HashMap的使用

Posted yxz1025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解java中HashMap的使用相关的知识,希望对你有一定的参考价值。

当你自己创建用作hashMap的键的类,用可能会忘记其中需要覆盖的一些必须方法,而这种会是一个致命的错误
例如,有两个对象,将Person对象与Dog对象联系起来,这看起来很简单,使用Person作为键,Dog作为值:

public class Person
    protected int number;
    public Person(int i) number = i;
    public String toString()
        return "Person " + number;
    


public class Dog
    private static Random rand = new Random(47);
    private boolean shadow = rand.nextInt();
    public String toString()
        if(shadow)
            return "dog is likely";
        else
            return "dog is badly";
        
    


public class App
    public static <T extends Person> void execute(Class<T> type)
        Constructor<T> ghog = type.getConstructor(int.class);
        Map<Person, Dog> map = new HashMap<Person, Dog>();
        for(int i= 0; i < 10; i ++)
            map.put(ghog.newInstance(i), new Dog());    
        
        print("map = " + map);
        Person p = ghog.newInstance(3);
        print("Look up for " + p);
        if(map.containsKey(p))
            print(map.get(gh));
        else
            print("key not found: " + p);
        
    

    public static void main(String[] args) throws Exception
        execute(Person.class);
    

    //output

每个Person被赋予一个数字,于是可以在HashMap中查找值,但

Person是自动继承Object的,所以这里的使用了Object的

hashcode()方法生成散列码,而他默认使用对象地址计算散列码,

因此,两者之间其实是不同的键,所以这里,我们需要覆盖原始的hashCode方法和equals方法,

正确的equals方法必须满足五个条件:

  1. 自反性。对任意的x, x.equals(x)一定返回true;
  2. 对称性。对任意x和y,如果y.equals(x)返回true, 则x.equals(y)也 返回true;
  3. 传递性。对任意x,y,z ,如果有x.equals(y)返回true; y.equals(z)返回true,则x.equals(z)一定返回true;
  4. 一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用多少次,返回的都是一致的,
  5. 对任何不是null的x, x.equals(null)一定返回false

以上是关于深入理解java中HashMap的使用的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JAVA集合系列:HashMap源码解读

Java中HashMap和TreeMap的区别深入理解

深入理解HashMap

对java中hashmap深入理解

Java 集合深入理解 :HashMap之扩容 数据迁移

深入理解 HashMap