面试:HashSet怎么判断重复

HashSet是基于HashMap实现的,元素的值存储在key上,value的值所有元素都一样,都是这个 private static final Object PRESENT = new Object();

HashSet集合不能存储重复的元素,那么元素之间是否重复,HashSet是根据什么机制去判断的呢?

HashSet在添加一个元素时(比如此时添加的是”a”这个元素),都会将该元素与set中所遍历到的每个元素作比较,比较的过程是这样的:先用该元素的hashCode值与遍历到的每个元素的hashCode作比较,如果hashCode不相等,则直接添加;若hashCode的值一样,则继续用该元素的equals()方法比较(是被添加的equals()方法,与之比较的元素作为参数),如果equals()方法得到的值是一样的,不再添加,如果equals()的值是不一样的,就会将该对象添加到其他内存地址(重新计算出不一样的hashCode)。

 

equals和hashCode

要明确:equals()相等的两个对象,hashcode()一定相等 ,equals()方法不相等的两个对象,hashCode()有可能相等。

Object类中:hashcode方法返回的是对象的hash地址,是个native方法,equals方法比较的是对象的地址

换句话说:当我们重写一个对象的equals方法,就必须重写他的hashCode方法,不过不重写他的hashCode方法的话,Object对象中的hashCode方法始终返回的是一个对象的hash地址,而这个地址是永远不相等的。

 为什么重写equals方法一定要重写hashCode方法

https://blog.csdn.net/mp252119282/article/details/83275549

posted @ 2018-11-20 19:07  箜篌nicole  阅读(1740)  评论(0编辑  收藏  举报