关闭

深入理解java中HashMap的使用

标签: javahashmap
141人阅读 评论(0) 收藏 举报
分类:

当你自己创建用作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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22302次
    • 积分:347
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条
    最新评论