正在写一篇博客,但是由于还没有去看过 hashset 或 hashmap 的源码,只是自己想当然的这么理解哈希容器放置元素的过程,怕自己误人子弟啊😂
- 放置元素时,先调用元素的 hashcode 方法,为元素找到哈希桶的位置,之后元素就会放到这个哈希桶里。
- 此时哈希桶里可能已经有了多个元素。根据上图,两个对象 hashcode 相同,并不能得出两个对象是否为 equal 的。而哈希容器是不允许有两个 equal 的元素同时放在容器里的。所以哈希桶里的每个元素会分别和传入的元素执行 equals 比较。
- 如果哈希桶的每个元素执行 equals 比较后,返回的都是 false,那么放入传入的元素。如果哈希桶里某个元素和传入的元素执行 equals 比较后,返回了 true,那么需要执行相应的策略( 1.用传入元素替换掉哈希桶里既存元素 2.忽略传入元素,哈希桶里既存元素不变)。
- 这也是为什么源码注释说,unequal 的两个对象最好是产生不同的 hashcode,因为一个哈希桶里的元素越多,需要执行的 equals 的次数就越多。