HashSet contains 方法解读

/ 2015-06-02
  1. 顾名思义 HashSet 就是使用Hash算法实现的Set了.
    那么在Java这边是如何实现的?
    通过查看源码可以发现在Set里面可以看到一个每次new HashSet的时候都有生成一个 HashMap 然而我们在使用 hashSet.add() 的时候也在往 map里面存数据 而对应value是使用了同一个 new Object()。

  2. contains方法不一定需要遍历Set
    查看HashMap的内部实现可以看到其实是由一个 Map.Entry[] 构成的。 这样或许不能说明什么。关键在于数组的下标,当有新的K,V 被插入的时候,首先根据key计算对应的Hash值(String类型的会通过 Hashing.stringHash32,对象就直接使用其hashCode)然后得到对应的 hash 使用 hash & (length-1) (这里length为当前数组大小。)得到了一个对应的数组的下标。然后通过 Entry.key Entry.value 这样对象进行填充。于是就完成了一次put的操作。既然明白了put的操作后,再来看是否需要进行遍历就清楚了。在使用contains方法的使用就只需要通过计算传入的key进行hash通过再次通过hash&(length-1) 的方式得到对应的下标就可以得到是否存在这个Key了。什么时候需要进行遍历,Hash冲突的情况下。

小结

使用Set List Map 进行添加的本质实在操作对应的数组,如果只是保存数据不考虑到数据的查找数组的效率会高。存在查找的情况使用Set更加的方便,个人感觉效率会高于数组遍历的查找

转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/hashset-contains.html