Java集合框架源码研读-HashSet

Posted by AlstonWilliams on February 17, 2019

HashSet是一种Set的实现.

为什么需要Set这种数据结构呢?因为假设我们想要存储不能重复的元素,我们会怎么做?会选择哪种数据结构?数组还是链表?

选用数组或者链表,我们都需要时间复杂度为O(n)的检查操作来检查元素有没有重复.

“等一下”,你可能会说.

“我们可以选择BST啊,这样我们只需要时间复杂度为O(logn)的检查操作.”

确实可以这样做,但是还有没有更好的解决方案呢?

“当然有”, 你朋友说.

他又接着说:”我们之前有学过HashMap的,为什么不用HashMap来实现呢?这样时间复杂度仅为O(1)啊.”

你反驳说:”但是HashMap是键值对的形式呀,而我们这里只是单个数据的形式,又不是键值对的形式.”

“用这个数据做key不就好了嘛,value随便找个占位符放那儿不就完事了嘛!”

bingo!

就是这样,HashSet内部维护着一个HashMap,用这个HashMap存放实际的数据.然后用我们想要插入的数据做key,再找一个对象做占位符,当做value.

就是这么简单.

HashSet中,可以存放null.因为HashMap中就允许null键值对存在.

另外,由于HashSet内部的数据结构为HashMap,所以你为HashSet设置的initial capacity以及load factor同样会影响其性能.