千家信息网

JDK的Set源码分析

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"JDK的Set源码分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"JDK的Set源码分析"文章能帮助大家解决问题。首先,我们看一下Hash
千家信息网最后更新 2025年01月19日JDK的Set源码分析

这篇文章主要介绍"JDK的Set源码分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"JDK的Set源码分析"文章能帮助大家解决问题。

首先,我们看一下HashSet

  1. private transient HashMap map;


  2. // Dummy value to associate with an Object in the backing Map

  3. private static final Object PRESENT = new Object();

可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?

  1. public boolean add(E e) {

  2. return map.put(e, PRESENT)==null;

  3. }

在hashMap中,我们大多数时候是用value,但是在set的时候,却很好的利用了已有类HashMap,他利用了HashMap的key的唯一性来保证存储在Set中的元素的唯一性;

private static final Object PRESENT = new Object();

是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;

我们最后拿到的迭代器也是:

  1. public Iterator iterator() {

  2. return map.keySet().iterator();

  3. }


map的keySet的迭代器;

同理,我们看看LinkedhashMap;

  1. public LinkedHashSet(int initialCapacity, float loadFactor) {

  2. super(initialCapacity, loadFactor, true);

  3. }


  4. /**

  5. * Constructs a new, empty linked hash set with the specified initial

  6. * capacity and the default load factor (0.75).

  7. *

  8. * @param initialCapacity the initial capacity of the LinkedHashSet

  9. * @throws IllegalArgumentException if the initial capacity is less

  10. * than zero

  11. */

  12. public LinkedHashSet(int initialCapacity) {

  13. super(initialCapacity, .75f, true);

  14. }


  15. /**

  16. * Constructs a new, empty linked hash set with the default initial

  17. * capacity (16) and load factor (0.75).

  18. */

  19. public LinkedHashSet() {

  20. super(16, .75f, true);

  21. }

调用了父类的构造函数;构造函数如下:

  1. HashSet(int initialCapacity, float loadFactor, boolean dummy) {

  2. map = new LinkedHashMap(initialCapacity, loadFactor);

  3. }

生出了LinkedHashMap;

同理,我们一样可见到treeMap的实现:

  1. private transient NavigableMap m;


  2. // Dummy value to associate with an Object in the backing Map

  3. private static final Object PRESENT = new Object();

关于"JDK的Set源码分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0