Java集合之Set

简述

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自定义类的比较样例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值