HashSet源码分析


title: HashSet源码解析
date: 2018-08-09 16:00:26
tags: java
---

1. 引言

HashSet 实现了 Set 接口,底层的数据结构是一个 哈希表(实际上是一个 HashMap 实例),所以,要了解 HashSet,最主要的还是要了解 HashMap,有关 HashMap 源码分析可以看 这篇文章。HashSet 主要有以下特点:

  • 因为底层的数据结构是 HashMap,所以允许 null 值的存在。
  • 因为底层的 HashMap 会重新构造 hash table 的大小,因此并不能保证迭代的顺序和存储顺序一致。
  • HashSet 所有的元素存在 HashMap 的 key 中,对应的 value 是一个静态变量 private static final Object PRESENT = new Object(),因为 HashMap 中 key 是唯一的,因此 HashSet 不允许存在重复值。
  • 它并不是同步的,JDK 提供了这样的方法可以创建出一个同步的 HashSet:
    Set set = Collections.synchronizedSet(new HashSet())
  • iterator 方法返回的是迭代器是 fail-fast,在创建了迭代器之后如果对该 HashSet 进行修改的话(除非是代用迭代器自己的 remove 方法),将会抛出 ConcurrentModificationException。

2. 常规操作

HashSet 的增删改等操作都是调用 hashMap 来完成的,因此不再做过多的分析

public Iterator<E> iterator() {
    return map.keySet().iterator();
}

public int size() {
    return map.size();
}

public boolean isEmpty() {
    return map.isEmpty();
}

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

转载于:https://www.cnblogs.com/firepation/p/9449944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值