hashcode有什么用
每个java对象都有一个hashcode,并且这个hashcode需要和equal()方法保持一致,使用hashcode是为了让hashmap、hashset等等这些集合提高效率的。
拿hashmap做个例子,每个存入hashmap的key不能重复。
如果hashmap里面已经有100个元素了,那第101个元素要存进去时,就得和前100个元素进行比较,有相同的就不存进去,没有相同的就存进去,效率太低了。
而hashcode可以对应着元素在hashmap中的一个地址(不是指内存地址),如果这个地址还没有存储元素(也就是说第101个元素的hashcode和其他元素都不一样),直接将元素存进去就行了,需要元素的时候根据hashcode从地址中取出即可,效率可太快了,但是为什么能这样子呢。
hashcode是怎么来的
先看一下java源码的一些简单类的hashcode方法
Integer的hashcode,直接返回value值
Float的hashcode,跟value值也有很大关系
String的hashcode,也是通过对value的一系列计算得到
这些类的hashcode都跟自身的value有关,那我们就明白了一点,hashcode是可以用来互相比较的。 再看前面说的例子,既然hashcode与其他元素不一样,value就与其他元素不一样,当然可以直接存储进hashmap中。
这里要求一个前提:两个对象的hashcode不一样,那这两个对象一定是不一样的。
当然,hashcode一样的两个对象,不一定是一样的。
两个不同对象计算出来的hashcode相同,就出现了hash碰撞
所以在hashmap中,第101个元素的hashcode那个位置已经有人时,不代表这个元素重复,还得用equal()方法判断,当然只要hashcode()方法足够优秀,就能大大提高效率。
如果一个元素并不重复但hashcode值的位置已经被占有时,元素要如何存储就看具体实现了,hashmap是开了一个链表来存储这类元素。
重写了equal(),最好重写hashcode()
这里做个提醒,hashcode就是为了减少比较次数,那必然是跟equal方法一致的。如果忘了重写hashcode方法,就可能违反:两个对象的hashcode不一样,那这两个对象一定是不一样的。
会出现一些怪异的现象,比如,hashmap中放进了两个相同的对象。