1. Set接口的特点

  1. a:它是个不包含重复元素的collection。<br /> b:Set集合取出元素的方式可以采用:Iteratorforeach。<br /> c:Set集合有多个子类,这里我们介绍其中的HashSetLinkedHashSet这两个集合。

2. Set特有的方法

  • A U B Union: setA.addAll(setB)
  • A ∩ B Interaction: setA.retainAll(setB)
  • A - B Different : seetA.removeAll(setB)

    3. HashSet

    实现Set接口,由哈希表支持(实质上是一个HashMap). 它不保证set的迭代顺序:特别是它不保证该顺序恒久不变。此类允许使用null元素。

    A. HashSet集合的自身特点:

  • HashSet底层是采用HashMap实现的。

  • 存储,取出都比较快
  • 线程不安全,运行速度快
  • Hash value 是存入HashSet的依据

    B. HashSet 与 HashMap的关系

    1、HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。
    2、HashMap的key就是放进HashSet中对象,value是Object类型的。
    3、当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量。

    C. HashSet的存储过程

    和HashMap一样,HashSet采用哈希算法,底层用数组存储数据。默认初始化容量16,加载因子0.75。
  1. 调用HashMap的hash()方法计算出数组下标
  2. 如果数组该位置不为空,才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

    4. LinkedHashSet

    特性:
  • 继承自HashSet,与HashSet不同之处是:LinkedHashSet维护着一个运行于所有条目的双重链表。这个双向列表定义了迭代顺序,即按照将元素插入到set中的顺序进行迭代
  • 有序,存储和取出顺序相同
  • 线程不安全,运行速度快