HashSet源代码分析(JDK1.8)

首先来看一下HashSet类的定义、常用构造方法、常用的类成员方法以及内部的成员变量:
HashSet类的定义如下:

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

由上述代码可见,HashSet扩展了AbstractSet类,并实现了Set、Cloneable、Seriablizable接口。

HashSet内部的私有成员变量如下:

//内部实际上采用HashMap存储元素。
private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

常用的构造方法如下:

 HashSet();
 HashSet(Collection<? extends E> c);
 HashSet(int initialCapacity);
 HashSet(int initialCapacity,float loadFactor);

常用的类成员方法如下:

//添加元素
 boolean add(E e);

//获取元素
boolean contains(Object o);
boolean isEmpty();
Iterator<E> iterator();
int size();

//移除元素
boolean remove(Object o);

下面将根据源码对上述方法进行分析:

1. 构造方法

//构造一个新的空Set,内部的map指向一个默认大小为16,默认加载因子为0.75的HashMap实例。
public HashSet() {
     map = new HashMap<>();
 }

//构造一个HashMap,容量必须大于等于16;
public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);   //addAll方法继承自AbstractCollection,通过循环调用add方法
}

//创建指定容量和装载因子的HashMap
public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
}

//指定容量,采用默认装载因子0.75的HashMap
 public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
  }

2. 元素的添加

2.1 add方法
public boolean add(E e) {
        return map.put(e, PRESENT)==null;   //直接调用HashMap的put方法,通过返回值为null判断元素e是否原来就已经存在,PRESENT是final常量,主要用于map中键值对的值,
    }

3. 元素的获取

3.1 contains方法
public boolean contains(Object o) {
        return map.containsKey(o);   //同样是直接调用map的contains方法
    }
3.2 isEmpty方法
public boolean isEmpty() {
        return map.isEmpty();   //直接调用map的isEmpty方法
    }
3.3 iterator方法
public Iterator<E> iterator() {
        return map.keySet().iterator();   //通过调用map的keySet方法,获取键集合的iterator
    }
3.4 size方法
public int size() {
        return map.size();   //直接调用HashMap的size方法;
    }

4. 元素的移除

4.1 remove方法
public boolean remove(Object o) {
        return map.remove(o)==PRESENT;   //直接调用HashMap的remove方法
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值