深入理解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
上一篇为什么使用koa2搭建微信第三方公众平台
下一篇乐刻大数据平台架构实践
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭