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?