Set

本文详细探讨了Java中HashSet、LinkedHashSet及TreeSet的具体实现原理。通过对这些集合类的源码分析,揭示了它们分别基于HashMap、LinkedHashMap及TreeMap实现的内部机制,并概述了不同集合的特点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始有看源码的时候,最先看的是set,点进源码之后才看到,set内部是用map实现的,花了几天时间看了集中map源码,看完之后也会忘,但是还是有很大收获,读源码的道路还是要继续下去。
HashSet
HashSet继承了AbstractSet,实现了Set、Cloneable、Serializable接口。
HashSet内部的实现方式是HashMap

    public HashSet() {
        map = new HashMap<>();
    }

但是set只有value,没有key,所以用了一个final类型的Object作为value

private static final Object PRESENT = new Object();

对set的操作过程都是调用hashMap的方法。
LinkedHashSet
LinkedHashSet继承HashSet,实现了Set、Cloneable、Serializable接口。
LinkedHashSet内部也没有特别的方法,直接使用了父类HashSet的三个参数的构造方法方法

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

也就是说,LinkedHashSet内部是以LinkedHashMap实现的。
TreeSet
TreeSet继承AbstractSet,实现了NavigableSet、Cloneable、Serializable接口。
TreeSet内部使用了TreeMap实现

    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

总结

  1. HashSet内部通过HashMap实现,具有HashMap的性质。
  2. LinkedHashSet内部通过LinkedHashMap实现,具有LinkedHashMap的性质。
  3. TreeSet内部通过TreeMap实现,具有TreeMap性质。

JDK版本1.8.0_92。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值