Java 的集合有两类,一类是 List,还有一类是 Set。List是有序可重复,Set 无须不重复。
当我们在 set 集合中插入的时候怎么判断是否已经存在该元素呢,可通过 equals 方法。但是如果元素太多,用这样的方法就会比较慢。
于是就有人发明了 哈希算法
来提高集合中查找元素的效率。
这种方式将集合分成若干个存储区域,每个存储的对象可以计算出一个哈希码,可以将哈希码范围分组划分,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的哪个区域。
它返回的就是根据对象的内存地址换算出来的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的 hashCode 方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的 equals 方法与新元素进行比较:相同的话就不存了,不相同就散列其他地址。这样一来实际调用 equals 方法的次数就大大降低了,几乎只需要一两次。
不对,两个对象的 hashCode() 相同,equals() 不一定 true。
示例:
String str1 = "通话";String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395
false
很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,
因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等,还有 equals 方法判断。只有 hashCode() 和 equals() 方法两个判断都相等才判断两个对象相等。
评论