先上结论:如果需要将自定义类对象作为HashMap的key,那么自定义类中需要重写hashCode()和equals()
Object.class
public boolean equals(Object obj) {
return (this == obj);
}
public native int hashCode();//非Java语言的实现,直接来源于JVM底层
HashMap.class
在进行Put操作的时候会匹配key.hashCode的hash是否一样,如果不一样的就直
接进行插入操作了,如果hash一样的情况下,就会进行equal的比较,去比较两个
对象是否一样,看Map中是否存在该对象了.
实例:
当你新建两个Integer对象
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
这两个对象是不等的:i1==i2结果显然为false,但是这两个对象的引用是一样
的,也就是引用的1来源于同一个地址。为什么要说这个?看下面代码:
HashMap<Integer,Integer> iMap = new HashMap<>();
iMap.put(i1,1);
iMap.put(i2,2);
System.out.println(iMap.get(i1));
System.out.println(iMap.get(i2));
清楚结果了?输出的结果为两个2,常识上的理解,这个结果是正常,非常赞同。
看到下面的自定义class对象:
public static void main(String[] args) {
Student stu1 = new ArrayListDemo().new Student("Mrlj", "B");
Student stu2 = new ArrayListDemo().new Student("Mrlj", "B"