不同的Integer对象值相同在hashMap中会当成同一个Key
问题
为什么不同的Integer在hashMap中会当成同一个Key?
public static void main(String[] args) {
Map<Integer, Integer> integerIntegerHashMap = new HashMap<>();
integerIntegerHashMap.put(1,5);
integerIntegerHashMap.put(1,6);
integerIntegerHashMap.put(new Integer(1),7);
integerIntegerHashMap.put(new Integer(1),8);
System.out.println(integerIntegerHashMap.keySet());//结果是[1]
/*
用VM检测对象内存要导这个Java 对象布局 ( JOL ) 工具
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
*/
//这个证明了new出来的Integer绝对不是同一个对象(new出来都是新对象,不存在用什么常量缓存)
//System.out.println("--------内存位置---------");
//System.out.println(VM.current().addressOf(new Integer(1)));
//System.out.println(VM.current().addressOf(new Integer(1)));
}
解答
因为Integer重写了hashCode函数和equals函数,Integer对象的hashCode和值是值本身,所以在HashMap中不同new出来的Integer是同一个Key(因为hashCode和equals被重写了)
//hashCode是值本身
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
//对比是值本身
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}