深入理解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方法必须满足五个条件:
- 自反性。对任意的x, x.equals(x)一定返回true;
- 对称性。对任意x和y,如果y.equals(x)返回true, 则x.equals(y)也 返回true;
- 传递性。对任意x,y,z ,如果有x.equals(y)返回true; y.equals(z)返回true,则x.equals(z)一定返回true;
- 一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用多少次,返回的都是一致的,
- 对任何不是null的x, x.equals(null)一定返回false
以上是关于深入理解java中HashMap的使用的主要内容,如果未能解决你的问题,请参考以下文章