HashSet contains 方法解读

Category:

/

Date:

  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更加的方便,个人感觉效率会高于数组遍历的查找

最后更新:2015-06-03 07:36:30.0

—— 原创内容,转载请注明:[ 文章转载自:小春 ' s blog   / ] ——