参考:https://mp.weixin.qq.com/s/TE225z9vKrq_DmLE_QciKA函数
只见一尘号召了全部的弟子,把他们的名字都添加到他本身构造出的一个List集合里面去了。3d
这里一尘选择了 ArrayListorm
而后用 contains() 方法判断输入的那个名字在没在 List 集合里。cdn
结果:
对象
HashSet 它实现了 Set 接口,而Set集合的特性就是没有重复元素,因此他能够自动的去掉重复元素。而且它的底层是使用 散列表来实现的,因此它的一些经常使用操做。blog
好比:添加元素add(),移除元素remove(),是否包含某个元素contains()的时间复杂度都为O(1)
到时候每查一我的,你只须要判断它在没在集合里,你能够用 contains() 来判断。
和List在使用上没有多大区别,把List换成Set就行。
HashSet会自动帮你去重。
能够看到,它的构造函数实际上是new了一个HashMap。
这个map是HashSet的一个成员变量
HashMap底层使用了散列表,因此速度很快
能够看到,在用HashSet的add()方法的时候,其实就是将你要add的元素 e 做为 HashMap的 Key,把 PRESENT 做为Value进行存储的。
而 PRESENT 是一个固定不变的 Object
元素被 add 进 HashSet 中的样子是这样的:
HashSet容量为 8
当 HashSet 被add()进两个相同的元素的时候,此时 HashMap 中以前存在的Key不会发生改变。
只是 Value 被替换了,而后就return了。这样也就达到了去重的目的(第二个重复的Key没有被添加进来)。
此段代码在HashMap的 put() 方法之中
而后再主程序中加入到Set中就好了。
看一下下面的代码:
两个名字和性别都同样的学生,按理来讲应该是同一我的了(逻辑上同样),可是它的 set 集合输出却有两个一尘,都是男的,没有去重。
能够看到 会调用 k 的hashCode. k就是你add进去的 Key,对 Key不重写hashCode就会默认调用父类Object的hashCode方法。
而 Object 的 hashCode 是 native 的,这个 hashCode 根据虚拟机的策略可能会返回和对象地址相关联的值。
你上面new的两个Student虽然逻辑上同样,可是两个对象的地址不同,因此它们的hashCode可能会根据地址来计算,就会产生不一样的hashCode,从而落在了不一样的位置(桶)中了。
由于key在被put进map中的时候,它到底落在哪一个位置(桶)是由它的hashCode决定的。
HashMap中的put方法
这里能够看到,就算你的两个对象的hashCode同样(e.hash==hash),落在了同一个位置(桶),可是若是你不重写equals方法,那么在判断HashMap集合里是否存在相同的元素的时候,就会根据Object的equals方法来判断。
能够看到Object的equals是比较的对象的地址,而你new了两个对象,他们的地址不同,因此这里就不 return,而是把你的逻辑相同的Student加入到 HashMap之中。
这样仍是有重复元素。
只见慧能随手一写: