Java集合之HashSet和TreeSet源码解析

31 篇文章 0 订阅
16 篇文章 2 订阅

目录

1.HashSet

1.1HashSet整体架构

1.2初始化源码解析

1.3增加源码解析

2.TreeSet

2.1TreeSet整体架构

2.2增加源码解析

2.3迭代器方法


1.HashSet


1.1HashSet整体架构

  • 底层实现基于HashMap,使用了组合的方式把HashMap当成一个实例变量来实现
// 把 HashMap 组合进来,key 是 Hashset 的 key,value 是下面的 PRESENT
private transient HashMap<E,Object> map;
// HashMap 中的 value
private static final Object PRESENT = new Object();

1.2初始化源码解析

// 对 HashMap 的容量进行了计算
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

c.size为当前的期望值,0.75为默认的扩容大小,进行加一是为了比扩容的临界值大于1,避免扩容

默认大小为16,要进行比较。

1.3增加源码解析

public boolean add(E e) {
    // 直接使用 HashMap 的 put 方法,
    // 不等于null说明HashMap进行了覆盖原有的值,key发生了重复
    return map.put(e, PRESENT)==null;
}

ps:使用了策略模式,定义一系列的算法簇并且实现,来组合进主类里

 


2.TreeSet


2.1TreeSet整体架构

  • 跟HashSet的大致结构类似,底层是用了TreeMap进行了组合(作为实例变量)

2.2增加源码解析

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

基于直接复用的方式

2.3迭代器方法

//直接复用的迭代器方法
public Iterator<E> descendingIterator() {
    // 直接使用 HashMap.keySet 的迭代能力
    return m.keySet().iterator();
}

// NavigableSet 接口,定义了迭代的一些规范,和一些取值的特殊方法
public interface NavigableSet<E> extends SortedSet<E> {
    Iterator<E> iterator();
    E lower(E e);
}  
// m.navigableKeySet() 是 TreeMap 写了一个子类实现了 NavigableSet
// 接口,实现了 TreeSet 定义的迭代规范
public Iterator<E> iterator() {
    return m.navigableKeySet().iterator();
}

descendingIterator方法采用了直接复用的方式来实现

iterator方法采用了另一种方法,自己定义了迭代的使用规范然后让TreeMap去具体实现

ps:使用了策略模式,定义一系列的算法簇并且实现,来组合进主类里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值