1.Set接口
- 元素不重复、无序的
Collection
。 - 遍历方式只有迭代器。
1.1特点
- 元素存取无序。
- 元素唯一。
1.2实现类
- HashSet 类:
- 默认不保证有序。
- LinkedHashSet 集合:
HashSet
的子类,它是链表和哈希表组合的一个数据存储结构。存取有序。
- TreeSet 类:
- 元素存取无序,元素可排序。
1.3方法
Set
集合没有特有的功能,都是Collection
父接口中的方法。
2 HashSet类
2.1底层
HashSet
是基于HashMap
实现的。- 代码实现:
private transient HashMap<E,Object> map
- 使用一个常量作为所有键值对的值:
private static final Object PRESENT = new Object()
2.2特点
- 允许空元素(
ConcurrentLinkedQueue
类不允许)。 - 线程不安全(
CopyOnWriteArraySet
安全)。 - 元素唯一:因为是
HashMap
的键。
2.3构造方法
HashSet()
- 可选参数:
Collection<? extends E> c
int initialCapacity
float loadFactor
2.4方法
boolean add(E e)
:添加元素。- 源码示例:
return map.put(e, PRESENT)==null;
- 源码示例:
boolean remove(Object o)
:移除元素。- 源码示例:
return map.remove(o)==PRESENT;
- 源码示例:
void clear()
:清空集合。- 源码示例:
map.clear()
- 源码示例:
2.5 注意
- 给
HashSet
中存放自定义类型元素时,需要重写对象中的hashCode
和equals
方法,以保证HashSet
集合中的对象唯一性。