Hashcode
什么是hashcode
hashcode是对象的散列值,主要是根据对象的信息推导出来的一个整数值.
1.基本数据类型的hashcode都已经由jdk进行了重写.
2.string的hashcode是根据内容进行的重写.字段串内容一致,hashcode也会一样.
3.对于一个对象,其hashcode默认是其内存地址.

如果重写了hashcode

用途
在散列结构中,快速的进行索引.比如:hashMap,hashTable.
常见问题
为什么重写equals也需要同时重写hashcode.
答:会造成数据不一致问题.
分析场景:属性相同的UserA和UserB,hashmap的插入和查询.
知识要点:
1.hashMap的插入逻辑:比较hashcode,h%length得到list的槽位,然后依次equals比较对象,有则覆盖,无则添加.
2.Object基类equals默认比较的是地址.
场景1.只重写了equals而没有重写hashcode.
添加的时候,A和B的hashcode会有2个,这也决定了A和B落在不同的槽位上.原本应该覆盖的,却进行了新增.
查询的时候,hashcode==地址,基本上不会和添加的A和B相同,所以也无法查出数据.

场景2.只重写了hashcode,而没有重写equals
hashcode相同,槽位在同一个,但会在链表上添加2个,在比较equals的时候,地址不同,因此也无法从map拿到值.

场景3:equals和hashcode都进行了重写.

可以看到,map中只插入了一条数据,同时,后续也可以查找出来.
Last updated
Was this helpful?