在Java集合框架中,Set
集合用于存储不重复的元素。Set
集合有三种主要实现类:HashSet
、LinkedHashSet
和 TreeSet
。每种实现都有其独特的特点和使用场景。本文将详细解析这三种 Set
集合的特点和实现原理。
一、Set集合概述
Set
是一个不包含重复元素的集合。它的主要特点包括:
- 无序性:通常情况下,
Set
不保证元素的顺序(LinkedHashSet
和TreeSet
除外)。 - 唯一性:
Set
中的每个元素都是唯一的,不允许有重复的元素。
二、HashSet
1. 特点
- 无序:
HashSet
不保证元素的顺序。 - 快速访问:由于基于哈希表实现,
HashSet
提供常数时间的增删改查操作。 - 允许一个
null
元素。
2. 实现原理
HashSet
基于 HashMap
实现。具体来说,HashSet
内部使用一个 HashMap
来存储元素,其中元素作为 HashMap
的键,值为一个固定的对象。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
}
3. 使用示例
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Orange");
三、LinkedHashSet
1. 特点
- 有序:
LinkedHashSet
按照插入顺序保存元素。 - 性能稍逊于
HashSet
:由于维护了一个双向链表,性能略低于HashSet
。
2. 实现原理
LinkedHashSet
继承自 HashSet
,其内部使用一个 LinkedHashMap
来存储元素。LinkedHashMap
在 HashMap
的基础上增加了一个双向链表,用于维护插入顺序。
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet() {
super(new LinkedHashMap<>());
}
}
3. 使用示例
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");
四、TreeSet
1. 特点
- 有序:
TreeSet
基于元素的自然顺序或通过Comparator
提供的顺序进行排序。 - 性能较低:由于基于红黑树实现,增删改查操作的时间复杂度为O(log n)。
- 不允许
null
元素:在添加null
元素时会抛出NullPointerException
。
2. 实现原理
TreeSet
基于 NavigableMap
接口的 TreeMap
实现。TreeMap
是一种红黑树的实现,确保元素有序。
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable {
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<E,Object>());
}
public boolean add(E e) {
return m.put(e, PRESENT) == null;
}
}
3. 使用示例
Set<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Orange");
五、对比分析
特点 | HashSet | LinkedHashSet | TreeSet |
---|---|---|---|
存储顺序 | 无序 | 插入顺序 | 自然顺序或比较器顺序 |
实现方式 | 基于 HashMap |
基于 LinkedHashMap |
基于 TreeMap |
是否允许 null 元素 |
是 | 是 | 否 |
时间复杂度 | O(1) | O(1) | O(log n) |
应用场景 | 快速查找、插入、删除 | 保留插入顺序 | 有序集合操作 |
六、思维导图
graph TB
A[Java Set 集合] --> B[HashSet]
A --> C[LinkedHashSet]
A --> D[TreeSet]
B --> E[无序]
B --> F[基于HashMap]
B --> G[允许一个null]
C --> H[有序]
C --> I[基于LinkedHashMap]
C --> J[允许一个null]
D --> K[有序]
D --> L[基于TreeMap]
D --> M[不允许null]
七、总结
在Java中,Set
集合用于存储不重复的元素,其三种主要实现 HashSet
、LinkedHashSet
和 TreeSet
各有特点。HashSet
提供快速访问但无序,LinkedHashSet
在保持插入顺序的同时提供快速访问,TreeSet
则提供有序的元素存储。理解这些实现的特点和原理,有助于在不同的应用场景中选择合适的集合类型。
蓝易云2024-05-10 00:03
发表在:分享一个在线工具网源码支持不错