数据结构 - Set 接口
简介
Set也是Collection
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中的所有元素