1:看一下add方法:
使用的是HashMap类中的put方法,map中的value是常量
2:思考一个问题,如果存入的值是int,或者一些基础类型,是很好理解的,这个不可重复其实是新的value代替了旧的value,只不是新旧value是一样的(PRESENT);
但是,如果存入的是一个对象呢,怎么保证其不重复呢????那我们看一下map中的put方法吧。
3:源码如下:
a:对key的hashCode进行hash,计算出应该在的位置index,
b:取出map中这个位置的元素e,e可能是一个链表(详情看程序员小灰HashMap的介绍),对这个位置的链表进行循环;
c:如果hash码值不相同,说明是一个新元素,存;
d: 如果hash码值相同,且equles判断相等,说明元素已经存在,不存;
e:如果hash码值相同,且equles判断不相等,说明元素不存在,存;
所以,判断两个对象是不是重复的,主要依靠的是hashCode方法和equals方法,所以,一个对象如果想通过HashSet方法判断是不是重复的,需要重写hashCode方法和equals方法
例如:
如:新建一个Person对象,重写hashCode方法
可以看出,Person对象内两个参数name,age,hash码值是这两者计算后的记过,那么完全有可能两个对象name,age都不同,hash码值相同;
下面看下equles()方法:
参考文章:https://blog.csdn.net/u010698072/article/details/52802179
https://www.cnblogs.com/nickhan/p/8550655.html
网友评论