记一次HashSet的源码阅读记录

                                  讨厌深夜的原因是它有太多不稳定因素。

最近一直再看有关于集合方面的代码,给我个人的感触,如果你是有一定的数据结构知识等去看集合的源码,相对于理解起来的话,就会更好的名字,存储集合元素的数据结构。当然,这也不是一遍就能彻底的理解好的啦,就有个大致的理解的。最终的还是需要长期的使用不断的提升来加强这方面,这纯属个人的感觉。

 

先上一张HashSet的关系图吧

从这个图就不难看出HasetSet上面的关系。然后HashSet实现起来都是基于HashMap的,利用HashMap的Key的唯一性和不重复来确保的,所以这就是我们经常和面试官聊的HashSet是元素不重复,没有顺序的原因,因为HashMap的Key保存也是无序的.

 

1 : 参数介绍

// 保存数据的HashMap
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map 翻译过来的意思就是 : 与备份映射中的对象关联的虚拟值
private static final Object PRESENT = new Object();

transient这个修饰符号,初次见到的时候也是搞不懂明白,后来百度就大致了解了作用,大致就是保证序列化的时候,被该字段修饰的,就不会被序列化,具体还是需要写代码去详细的体验看下效果是什么样子的。

 

2 : 构造函数

// 无惨构造函数;也就是初始化之前map
public HashSet() {
    map = new HashMap<>();
}
// 初始化一个map,然后调用addAll()方法来将数据都保存到map中
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
// 根据传入进来的数值大小,初始化一个Map
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
// 同上
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
// 根据传入进来的参数,初始化一个LinkedHashMap类型的Map
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

 

  3 : 方法介绍

      从下面的这些方法中可以看出,这些核心的方法,都是继续调用那个全局的Map的方法来实现的。

  // 长度 

public int size() {
    return map.size();
}
// 根据长度来判断是否为空的
public boolean isEmpty() {
    return map.isEmpty();
}
// 判断是否包含某个元素
public boolean contains(Object o) {
    return map.containsKey(o);
}
// 进行添加,Key 是传入进来的元素e , value 就是全局定义的Object对象
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
// 移除某个元素
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}
// 清空集合
public void clear() {
    map.clear();
}
// 克隆某个元素
public Object clone() {
    try {
        HashSet<E> newSet = (HashSet<E>) super.clone();
        newSet.map = (HashMap<E, Object>) map.clone();
        return newSet;
    } catch (CloneNotSupportedException e) {
        throw new InternalError(e);
    }
}
// 调用迭代器,也就是调用HashMap中的方法
public Iterator<E> iterator() {
    return map.keySet().iterator();
}

 

 好啦,HashSet的源码就是利用HashMap来实现的,当有面试官在问的时候,就说HashSet的唯一性是利用HashMap的Key来进行保证的。其实HashSet也就是利用HashMap来实现的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值