数据结构 - Set 接口

简介​

Set也是Collection 下的线性集合,用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。Set强依赖与Map,Set所有子类都是Map子类键的封装。

Set 接口
public interface Set<E> extends Collection<E>

继承Collection接口

Set 方法
// 长度
int size();
// 是否为空
boolean isEmpty();
// 是否包含某个值
boolean contains(Object o);
// 获取迭代器
Iterator<E> iterator();
//返回一个包含set中所有元素的数组
Object[] toArray();  
//返回一个包含此set中所有元素的数组;返回数组的运行时类型是指定数组的类型
<T> T[] toArray(T[] a); 
// 添加
boolean add(E e);
// 删除
boolean remove(Object o);
// 如果此set包含指定 collection 的所有元素,则返回 true
boolean containsAll(Collection<?> c); 
// 添加一个线性集合
boolean addAll(Collection<? extends E> c);
// 取交集,仅保留set中那些包含在指定 collection中的元素
boolean retainAll(Collection<?> c); 
//移除set中那些包含在指定 collection中的元素
boolean removeAll(Collection<?> c); 
// 清空
void clear();
// 是否相等
boolean equals(Object o);
//返回set的哈希码
int hashCode(); 

接口定义了Set集合基本方法。Set有一个抽象类AbstractSet,大部分子类都会继承AbstractSet

AbstractSet 抽象类
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> 

此类提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作

AbstractSet 构造函数
protected AbstractSet() {
}
AbstractSet 方法
public boolean equals(Object o) {
    if (o == this)
        return true;

    // 检查指定的对象是不是set
    if (!(o instanceof Set))
        return false;
    Collection<?> c = (Collection<?>) o;
    // 检查指定set的大小与这个set的大小是否相等
    if (c.size() != size())
        return false;
    try {
        // 检查这个set是否包含指定set中的所有元素
        return containsAll(c);
    } catch (ClassCastException unused)   {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
}

比较指定对象与此 set的相等性,如果指定的对象也是一个set,并且两个set有相同的大小,元素,则返回true。

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

返回此set的哈希码值:即该set中所有元素的哈希值之和

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

    //如果此set的大小>指定集合c的大小
    if (size() > c.size()) {
        //迭代指定集合c中的元素,并在此set中逐个删除
        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;
}

从此 set中移除包含在指定 collection中的所有元素

posted @ 2020-04-04 22:31  源码猎人  阅读(194)  评论(0编辑  收藏  举报