【集合類】源碼解析之 Set接口、AbstractSet抽象類

Set接口

不包含重複元素的集合。 更正式地說,集合不包含一對元素e1e2 ,使得e1.equals(e2) ,並且最多一個空元素

類聲明

public interface Set<E> extends Collection<E>

和Collection接口的方法一致,通過 equal()hashCode() 排重

AbstractSet抽象類

類聲明

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> 

構造函數

protected AbstractSet() {}

Set 方法實現

// 在此set集合中刪除指定集合中的所有元素
public boolean removeAll(Collection<?> c) {
    Objects.requireNonNull(c);
    boolean modified = false;
	// 如果set集合大小大於指定集合,則迭代指定集合的元素進行刪除
    if (size() > c.size()) {
        for (Iterator<?> i = c.iterator(); i.hasNext(); )
            // 只要成功刪除了一個元素則返回true
            modified |= remove(i.next());
    } else {
        // 如果set集合大小小於等於指定集合,則迭代set集合中的元素進行刪除
        for (Iterator<?> i = iterator(); i.hasNext(); ) {
            if (c.contains(i.next())) {
                // 只要成功刪除了一個元素則返回true
                i.remove();
                modified = true;
            }
        }
    }
    return modified;
}

Collection 方法實現

// 比較指定元素與此set的相等性
public boolean equals(Object o) {
    if (o == this)
        return true;
	// 如果指定元素不是Set類型則返回false
    if (!(o instanceof Set))
        return false;
    Collection<?> c = (Collection<?>) o;
    // 如果兩個set集合大小不相等則返回false
    if (c.size() != size())
        return false;
    try {
        // 如果set包含指定set中的所有元素則返回true
        return containsAll(c);
    } catch (ClassCastException unused)   {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
}

// 返回set的哈希碼值,即set中所有元素的哈希值和
public int hashCode() {
    int h = 0;
    Iterator<E> i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        // null值不計算
        if (obj != null)
            h += obj.hashCode();
    }
    return h;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章