java集合框架----Set 源码分析

Set 简述

Set 是一个不包含重复元素的集合。它继承于 Collection 接口。 它有以下特点:

  • Set与List不同,Java Set不是有序集合,它的元素没有特定的顺序
  • Set不提供对插入元素的位置的控制
  • Set不能通过索引访问元素,但是可以搜索列表中的元素
  • Set允许最多仅添加一个null元素
  • Set接口在Java 8中有一个默认方法:spliterator

Set 类图

Set 接口继承了 Collection 接口。 Collection 接口继承了 Iterable 接口。

一些常用的 Set 实现类有 :HashSet,LinkedHashSet,TreeSet,CopyOnWriteArraySet 和 ConcurrentSkipListSet。

AbstractSet 提供了 Set 接口的基本实现,以减少 Set 实现类的工作量。
java集合框架----Set 源码分析_第1张图片
Set 父接口:Collection < E > , Iterable < E >
Set 子接口:NavigableSet < E > , SortedSet < E >
Set 实现类:

  1. AbstractSet
  2. ConcurrentHashMap
  3. ConcurrentSkipListSet
  4. CopyOnWriteArraySet
  5. EnumSet
  6. HashSet
  7. JobStateReasons
  8. LinkedHashSet
  9. TreeSet

Set方法

返回类型 方法 方法描述
boolean add(E e) 如果指定的元素不存在,则将其添加到此集合。如果此set已包含该元素,则保持set不变并返回false
boolean addAll(Collection c) 如果指定集合中的所有元素不存在当前集合中,则将其添加到此集合中。 否则,addAll操作会修改此集合,使其值为两个集合的并集。 如果操作正在进行时修改了指定的集合,则此操作的行为是不确定的
void clear() 清空当前结合中的所有元素
boolean contains(Object o) 如果此set包含指定的元素,则返回true。当且仅当此集合包含元素e时才返回true(o == null?e == null:o.equals(e))
boolean containsAll(Collection c) 如果此set包含指定collection的所有元素,则返回true。 如果指定的集合是当前集合的子集,则返回true
int hashCode() 返回此set的哈希码值。 集合的哈希码被定义为集合中元素的哈希码的总和,其中空元素的哈希码被定义为零。 这意味着对于任何两个集合s1和s2的 s1.hashCode()== s2.hashCode()时,s1.equals(s2)
boolean isEmpty() 如果此set不包含任何元素,则返回true
Iterator iterator() 返回此set中元素的迭代器。 元素以无特定顺序返回
boolean remove(Object o) 从该集合中移除指定的元素,如果该元素存在集合中,则返回true
boolean removeAll(Collection c) 从当前集合中删除所有包含指定集合的元素
boolean retainAll(Collection c) 仅保留当前集合中包含指定集合中的元素。 换句话说,该方法最终结果为两个集合的交集
int size() 返回此集合中的元素数。 如果此set包含 Integer.MAX_VALUE 个元素,则返回 Integer.MAX_VALUE
default Spliterator spliterator() 在此集合中的元素上创建Spliterator
Object[] toArray() 返回包含此set中所有元素的数组。 返回的数组将是“安全的”,因为该集合不维护对它的引用。 (换句话说,即使此数组由数组支持,此方法也必须分配一个新数组)。 因此调用者可以自由修改返回的数组
T[] toArray(T[] a) 返回一个包含此set中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型。 如果集合适合指定的数组,则返回指定类型的数组。 否则,将使用指定数组的运行时类型和此set的大小分配新数组。如果此set适合指定的数组,并且有空余空间(即,数组的元素多于此set),则紧跟在该set结尾之后的数组中的元素将设置为null

java.util.Collection 继承的方法有:parallelStream, removeIf, stream
从接口 java.lang.Iterable 继承的方法有:forEach

Java Set 常用操作

Set上我们最常用的操作是add,addAll,clear,size等。下面是一个简单的Java Set 示例,显示了常用的方法用法。

 public static void main(String args[]) {
        Set<String> vowels = new HashSet<>();

        //add
        vowels.add("H");
        vowels.add("E");
        vowels.add("L");

        System.out.println("vowels:" + Arrays.toString(vowels.toArray()));

        Set<String> set = new HashSet<>();
        set.add("O");
        set.add("U");

        //将集合Set 中的元素全部添加到集合 vowels 中
        vowels.addAll(set);
        System.out.println("vowels.addAll(set):" + Arrays.toString(vowels.toArray()));

        //清空set
        set.clear();

        //set size
        System.out.println("vowels size : " + vowels.size());

        vowels.clear();
        vowels.add("E");
        vowels.add("E");
        vowels.add("I");
        vowels.add("O");
        System.out.println("判断集合 vowels 中是否包含 E = " + vowels.contains("E"));

    }

结果:

vowels:[E, H, L]
vowels.addAll(set):[E, U, H, L, O]
vowels size : 5
判断集合 vowels 中是否包含 E = true

你可能感兴趣的:(#,java集合框架)