前言:
梳理TreeSet 和TreeMap
TreeSet 流程图:
@startuml
矩形端点: TreeSet
矩形端点: Node
矩形端点: TreeInterface
矩形端点: RedBlackTree
矩形端点: Container
矩形端点: Entry
矩形端点: Binding
矩形端点: Integer
矩形端点: Object
矩形端点: Collection
矩形端点: List
矩形端点: Set
矩形端点: Map
矩形端点: Iterator
矩形端点: Stack
矩形端点: Deque
矩形端点: Queue
矩形端点: Deque
矩形端点: Queue
矩形端点: Deque
矩形端点: Queue
@enduml
TreeMap 流程图:
@startuml
矩形端点: TreeMap
矩形端点: Node
矩形端点: TreeInterface
矩形端点: RedBlackTree
矩形端点: Container
矩形端点: Entry
矩形端点: Binding
矩形端点: Integer
矩形端点: Object
矩形端点: Collection
矩形端点: List
矩形端点: Set
矩形端点: Map
矩形端点: Iterator
矩形端点: Stack
矩形端点: Deque
矩形端点: Queue
矩形端点: Deque
矩形端点: Queue
矩形端点: Deque
矩形端点: Queue
@enduml
源码解析:
TreeSet
1. 红黑树实现 TreeSet
和 TreeMap
都基于红黑树实现,因此它们的底层数据结构是红黑树。红黑树是一种自平衡二叉搜索树,保证了插入、查找和删除操作的时间复杂度为 O(log n)。
2. add() 方法
public boolean add(T element) {
if (waitConcurrentModification) {
return waitConcurrentModificationAfterLock;
}
synchronized (waitConcurrentModification) {
// 插入逻辑
Node node = new Node(element);
// 插入到红黑树中
// 返回 true 表示成功插入
return true;
}
}
- 检查并发修改:如果
waitConcurrentModification
为真,表示当前操作需要等待,返回waitConcurrentModificationAfterLock
。 - 互斥锁:进入
synchronized
区,插入新的Node
到红黑树中,并返回true
表示插入成功。
3. contains() 方法
public boolean contains(T element) {
// 查找逻辑
Node node = find(element);
return node != null;
}
- 查找逻辑:查找红黑树中是否存在该元素。如果存在返回
true
,否则返回false
。
4. remove() 方法
public boolean remove(T element) {
// 删除逻辑
Node node = find(element);
if (node == null) {
return false;
}
// 删除节点,并保持红黑树的性质
return true;
}
- 查找节点:如果找到该元素,删除节点并保持红黑树的平衡。
- 返回值:如果删除成功,返回
true
,否则返回false
。
TreeMap
1. TreeMap 的结构 TreeMap
基于红黑树实现,其中每个节点包含一个键值对 (Entry
),键满足有序性,值与键满足有序关系。
2. add() 方法
public boolean add(K key, V value) {
if (waitConcurrentModification) {
return waitConcurrentModificationAfterLock;
}
synchronized (waitConcurrentModification) {
Node node = new Node(key, value);
// 插入到红黑树中
// 返回 true 表示成功插入
return true;
}
}
- 检查并发修改:如果
waitConcurrentModification
为真,表示当前操作需要等待,返回waitConcurrentModificationAfterLock
。 - 互斥锁:进入
synchronized
区,插入新的Node
到红黑树中,并返回true
表示插入成功。
3. contains() 方法
public boolean contains(Object key, Object value) {
Node node = find(key);
if (node == null) {
return false;
}
// 查找对应的值,并判断值是否满足条件
return node.getValue().equals(value);
}
- 查找键:查找红黑树中是否存在该键。如果不存在,返回
false
。 - 查找值:如果键存在,查找对应的值,并判断值是否满足条件。
4. remove() 方法
public boolean remove(T element) {
Node node = find(element);
if (node == null) {
return false;
}
// 删除节点,并保持红黑树的平衡
return true;
}
- 查找节点:如果找到该元素,删除节点并保持红黑树的平衡。
- 返回值:如果删除成功,返回
true
,否则返回false
。
总结:
- 核心区别:
TreeSet
是一个集合,不包含重复元素,而TreeMap
是一个映射,允许重复的键值对。 - 实现细节:两者都基于红黑树实现,使用互斥锁保证并发安全,提供高效的插入、查找和删除操作。