java-TreeSet 和 TreeMap

前言:

梳理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 是一个映射,允许重复的键值对。
  • 实现细节:两者都基于红黑树实现,使用互斥锁保证并发安全,提供高效的插入、查找和删除操作。
### JavaTreeSet TreeMap 的数据结构及使用方法 #### TreeSet 数据结构 TreeSet 是基于 NavigableSet 接口实现的一个有序集合类,其内部通过 TreeMap 来存储元素。因此,TreeSet 底层实际上依赖于红黑树来维护元素之间的顺序[^1]。 #### 创建初始化 TreeSet ```java // 导入必要的包 import java.util.TreeSet; public class Main { public static void main(String[] args) { // 初始化一个空的 TreeSet 对象,默认自然排序 TreeSet<Integer> treeSet = new TreeSet<>(); // 添加一些整数到 TreeSet 集合中 treeSet.add(5); treeSet.add(3); treeSet.add(7); System.out.println(treeSet); // 输出: [3, 5, 7] } } ``` #### TreeMap 数据结构 TreeMap 实现了 SortedMap 接口,并且同样采用红黑树作为底层数据结构。这使得它能够高效地执行增删查改操作的同时保持键值对按指定顺序排列[^2]。 #### 创建初始化 TreeMap ```java // 导入必要的包 import java.util.TreeMap; public class Main { public static void main(String[] args) { // 构造一个新的、按照默认比较器升序排列 key-value 键值对映射表 TreeMap<String, Integer> map = new TreeMap<>(); // 插入若干条记录 map.put("apple", 10); map.put("banana", 20); map.put("orange", 30); // 打印整个映射表的内容 System.out.println(map); // 输出: {apple=10, banana=20, orange=30} } } ``` #### TreeSet TreeMap 的区别 尽管两者都利用了相同的红黑树机制来进行高效的查找与遍历,但是它们之间存在显著差异: - **功能定位不同**:TreeSet 主要用于保存不重复的对象序列;而 TreeMap 则是用来关联唯一性的键与其对应的值。 - **继承层次有别**:前者实现了 Set 接口并扩展自 AbstractSet 类;后者则是 Map 接口中的一员,具体来说是从 AbstractMap 抽象基类派生而来[^3]。 - **性能特点各异**:由于 TreeMap 存储的是键值对,在访问特定项时可能需要额外的时间开销去检索相应的 value 值;相比之下,当只需要关心成员本身而不涉及任何附加信息的情况下,TreeSet 可能会更加快捷方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下陈平安

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值