简述
set是一种没有重复元素的集合。也就是说用equals方法没有相等的元素,最多只有一个null。
相关类
public interface Set<E> extends Collection<E> {
// 查询操作
/**
* 元素个数,如果超过Integer.MAX_VALUE,则为Integer.MAX_VALUE
*/
int size();
/**
* 判断是否为空
*/
boolean isEmpty();
/**
* 判断元素是否存在
* 若类型不匹配,抛出 ClassCastException
* 若参数为null而set不允许,抛出 NullPointerException
*/
boolean contains(Object o);
/**
* 迭代器
*/
Iterator<E> iterator();
/**
* 转化成对象数组
*/
Object[] toArray();
/**
* 转化成特定类型数组
*
* String[] y = x.toArray(new String[0]);
*/
<T> T[] toArray(T[] a);
// 修改操作
/**
* 新增一个之前不存在的元素
* 若不支持add操作,抛出 UnsupportedOperationException
* 若元素类阻止其添加,则抛出 ClassCastException
* 若添加元素为null而set不允许,抛出 NullPointerException
* 若添加元素的一些属性阻止其添加,抛出 IllegalArgumentException
*/
boolean add(E e);
/**
* 移除某个元素
* 当此元素为空时而set不允许,抛出 NullPointerException
* 当此操作不支持时,抛出 UnsupportedOperationException
*/
boolean remove(Object o);
// 批量操作
/**
* 是否包含集合内的所有元素
* 有元素的类型和set不匹配,抛出 ClassCastException
* 集合中存在null而set不允许,抛出 NullPointerException
*/
boolean containsAll(Collection<?> c);
/**
* 将集合中的元素全部添加
* 不支持此操作时抛出 UnsupportedOperationException
* 集合中有元素的类不支持添加抛出 ClassCastException
* 集合中有null而set不允许抛出 NullPointerException
* 集合中元素的属性不支持添加,抛出 IllegalArgumentException
*/
boolean addAll(Collection<? extends E> c);
/**
* 保留集合中的所有元素
* 不支持此操作时,抛出 UnsupportedOperationException
* set中元素的类与集合中有不匹配,抛出 ClassCastException
* set中有null而集合不允许或者集合为null,抛出 NullPointerException
*/
boolean retainAll(Collection<?> c);
/**
* 移除集合中的所有元素
* 异常与上方法一致
*/
boolean removeAll(Collection<?> c);
/**
* 清除所有元素
* 不支持操作是抛出 UnsupportedOperationException
*/
void clear();
// 比较和哈希
/**
* 相等
*/
boolean equals(Object o);
/**
* 哈希值是所有元素的哈希值之和
* 保证equals相等时它也相等
*/
int hashCode();
/**
* 与java stream 并行相关
* @since 1.8
*/
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
}
HashSet
相关类
简介
它实现了set接口,底层由HashMap支持,允许null元素。
它的基本操作(add, remove, contains and size)都具有O(n)的时间复杂度。
注意它不是保证同步的。要保证同步,可以用以下写法:
Set s = Collections.synchronizedSet(new HashSet(...));
如果你使用了迭代器,但使用非迭代器的修改方法时,就会抛出ConcurrentModificationException。
注意
HashSet不能添加相同元素,如何判断相同,同一个自然是相同,Java的原生类中基本重写了equals方法,他们值相同即可认为相同,但若是自定义的类,没有重写equals方法,用的是Object的,那则以==判断,一般不为相同了。
TreeSet
相关类
简介
一个基于TreeMap的set实现,元素按照他们的自然顺序,或者自定义的Comparator排序。
它的基本操作都能保证O(log(n))的时间复杂度。
它也不是同步的,实现同步的方法与HashSet类似,修改时抛异常也与之类似。
自定义比较方法
自定义类的比较方式较为复杂,有人做了较好总结,这里就不重复造轮子了。
TreeSet自定义类的比较样例