栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashSet源码详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashSet源码详解

一、继承关系图

二、AbstractSet抽象类介绍 1、结构图

2、方法介绍
public boolean equals(Object o) {
    if (o == this)
        return true;

    if (!(o instanceof Set))
        return false;
    Collection c = (Collection) o;
    if (c.size() != size())
        return false;
    try {
        return containsAll(c);
    } catch (ClassCastException unused)   {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
}

首先判断类型是否一致,之后判断大小是否相等,最后调用方法containAll。

public int hashCode() {
    int h = 0;
    Iterator i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        if (obj != null)
            h += obj.hashCode();
    }
    return h;
}

迭代器遍历,返回所有对象的hashCode的和。

public boolean removeAll(Collection c) {
    Objects.requireNonNull(c);
    boolean modified = false;

    if (size() > c.size()) {
        for (Iterator i = c.iterator(); i.hasNext(); )
            modified |= remove(i.next());
    } else {
        for (Iterator i = iterator(); i.hasNext(); ) {
            if (c.contains(i.next())) {
                i.remove();
                modified = true;
            }
        }
    }
    return modified;
}

删除存在于c中所有元素,遍历少数量的集合。

三、HashSet类介绍

这个类实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持。允许null元素。

1、结构图

2、属性
// 维护这一个HashMap对象,HashSet本质上就是HashMap
private transient HashMap map;

// 维护着一个内容为空的对象
private static final Object PRESENT = new Object();
3、构造方法
public HashSet() {
    map = new HashMap<>();
}

public HashSet(Collection c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

// 这里有一个无用字段,是为了和之前的同参数构造方法区分开,这是用链表实现的
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new linkedHashMap<>(initialCapacity, loadFactor);
}
4、方法介绍
public Iterator iterator() {
    return map.keySet().iterator();
}

返回键集合的迭代器。

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

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

public boolean contains(Object o) {
    return map.containsKey(o);
}

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 newSet = (HashSet) super.clone();
        newSet.map = (HashMap) map.clone();
        return newSet;
    } catch (CloneNotSupportedException e) {
        throw new InternalError(e);
    }
}

几乎所有的方法都调用HashMap的方法,可以这样说:HashSet就是一个只是用到Map键值对中的键的HashMap。

private void writeObject(java.io.ObjectOutputStream s)
    throws java.io.IOException {
    // Write out any hidden serialization magic
    s.defaultWriteObject();

    // Write out HashMap capacity and load factor
    s.writeInt(map.capacity());
    s.writeFloat(map.loadFactor());

    // Write out size
    s.writeInt(map.size());

    // Write out all elements in the proper order.
    for (E e : map.keySet())
        s.writeObject(e);
}

private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
    // Read in any hidden serialization magic
    s.defaultReadObject();

    // Read capacity and verify non-negative.
    int capacity = s.readInt();
    if (capacity < 0) {
        throw new InvalidObjectException("Illegal capacity: " +
                                         capacity);
    }

    // Read load factor and verify positive and non NaN.
    float loadFactor = s.readFloat();
    if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
        throw new InvalidObjectException("Illegal load factor: " +
                                         loadFactor);
    }

    // Read size and verify non-negative.
    int size = s.readInt();
    if (size < 0) {
        throw new InvalidObjectException("Illegal size: " +
                                         size);
    }

    // Set the capacity according to the size and load factor ensuring that
    // the HashMap is at least 25% full but clamping to maximum capacity.
    capacity = (int) Math.min(size * Math.min(1 / loadFactor, 4.0f),
            HashMap.MAXIMUM_CAPACITY);

    // Create backing HashMap
    map = (((HashSet)this) instanceof linkedHashSet ?
           new linkedHashMap(capacity, loadFactor) :
           new HashMap(capacity, loadFactor));

    // Read in all elements in the proper order.
    for (int i=0; i spliterator() {
    return new HashMap.KeySpliterator(map, 0, -1, 0, 0);
}

之后介绍。

完结撒花★,°:.☆( ̄▽ ̄)/$:.°★

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/585094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号