不同的Integer对象值相同在hashMap中会当成同一个Key

不同的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;
    }
posted @   鸭梨的药丸哥  阅读(42)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示