Set集合的底层实现以及源码解析

HashSet


上图所示为HashSet类的源码的一部分,观察发现:

  • HashSet维护了一个一个HashMap对象
  • 维护了一个静态常量PRESENT= new Object();的理解就是为了填空而已,无实际意义!
  • 构造方法调用的时候直接new一个HashMap


上图为HashSet的iterator()

  • 可以发现获取HashSet的迭代器其实是获取map的keySet键的集合


HashSet的add方法

  • 实际调用了map的put方法,key为要添加的对象,value就是那个毫无作用的new Object

TreeSet

  • TreeSet的底层实现为TreeMap,与HashSet类似
  • TreeMap的底层数据结构为红黑树(自然排序)
  • TreeSet的元素是按照自然顺序来排序的
  • 添加到set的元素必须实现Comparable接口
  • 或者重写CompareTo方法

  • TreeSet的add其实也是map的put方法
  • 一样使用了一个Object占位
  • remove调用map的remove(key)

HashMap

  • HashMap与HashTable几乎是一样的
  • 除了HashMap是非同步的、允许空值的
  • HashMap不保证元素的顺序一直不变

  • 影响HashMap性能的有两个属性
  • initial capacity 初始化容量
  • load factor装载参数(设置当集合容量达到%多少的时候自动扩充)

小结

  • HashSet其实就是将值当做HashMap的键存入map里边
  • Map里的key就是我们存储到set的对象,map里的value都是一样的Object

以上为我自己查看源码以及google所获得,如果我的理解或表述有错误,还恳请大家指正!