java.util.HashSet源码解析

1.java集合框架图


2.所属包

package java.util;

3.继承与实现关系

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

4.准备工作

类HashSet实际上是操作一个HashMap的实例,不保证集合的迭代顺序,也不保证该顺序恒久不变,该类允许使用null元素。建议先看HashMap的源码解析 :          java集合之HashMap源码解析

5.属性

//由哈希表(实际上是一个 HashMap 实例)支持。
    private transient HashMap<E,Object> map;

    /*由于HashSet是对单值操作,而HashMap采用的是键值对的形式,由于HashSet的元素值作为了HashMap的键,那么对应的值就都是PRESENT。
	 *满足HashMap结构
	*/ 
    private static final Object PRESENT = new Object();

6.构造方法

/** 构造方法1:
     * 构造一个初始化容量为16,加载因子为0.75的HashMap
     */
    public HashSet() {
        map = new HashMap<>();
    }
 /** 构造方法2:
     * 采用HashMap的集合参数为构造方法的参数的方式
     */
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
	public boolean addAll(Collection<? extends E> c) {
        boolean modified = false;
        for (E e : c)
            if (add(e))
                modified = true;
        return modified;
    }
/** 构造方法3:
     * 输入一个初始化容量和加载因子的构造方法HashMap
     */
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
 /** 构造方法4:
     * 输入初始化容量的构造方法HashMap
     */
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

7.方法

add方法:

/**
     * 采用HashMap的put方法,如果添加的元素已经存在于HashMap中,那么就返回true,否则返回false
     */
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

remove方法:

/**
     * 采用HashMap中的remove方法,在HashMap中删除键对应的值就返回对应的Entry元素的值,将值与存入的PRESENT值比较。
	 * 如果值相同就删除成功,否则失败
     */
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }



-----------------------------该源码为jdk1.7版本的




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值