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 是一个映射,允许重复的键值对。
  • 实现细节:两者都基于红黑树实现,使用互斥锁保证并发安全,提供高效的插入、查找和删除操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在下陈平安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值