TreeMap相关详解
来源:互联网 发布:淘宝如何设置包邮 编辑:程序博客网 时间:2024/05/19 16:20
如果只需要存储功能,使用HashMap与LinkedHashMap是一种更好的选择;如果还需要保证统计性能或者需要对Key按照一定规则进行排序,那么使用TreeMap是一种更好的选择。
红黑树是为了维护二叉查找树的平衡而产生的一种树
- 根节点与叶节点都是黑色节点,其中叶节点为Null节点
- 每个红色节点的两个子节点都是黑色节点,换句话说就是不能有连续两个红色节点
- 从根节点到所有叶子节点上的黑色节点数量是相同的
TreeMap KEY不能为NULL VALUE可以为NULL
TreeMap KEY重复覆盖 VALUE可以为重复
TreeMap 按照自然顺序排序 或者按照算法排序
TreeMap 非线程安全
TreeMap
基于红黑树实现
- 父节点引用
- 左子节点引用
- 右子节点引用
- 节点颜色
static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> left = null; Entry<K,V> right = null; Entry<K,V> parent; boolean color = BLACK; ...}
增
- 获取根节点,根节点为空,产生一个根节点,将其着色为黑色,退出余下流程
- 获取比较器,如果传入的Comparator接口不为空,使用传入的Comparator接口实现类进行比较;如果传入的Comparator接口为空,将Key强转为Comparable接口进行比较
- 从根节点开始逐一依照规定的排序算法进行比较,取比较值cmp,如果cmp=0,表示插入的Key已存在;如果cmp>0,取当前节点的右子节点;如果cmp<0,取当前节点的左子节点
- 排除插入的Key已存在的情况,第(3)步的比较一直比较到当前节点t的左子节点或右子节点为null,此时t就是我们寻找到的节点,cmp>0则准备往t的右子节点插入新节点,cmp<0则准备往t的左子节点插入新节点
- new出一个新节点,默认为黑色,根据cmp的值向t的左边或者右边进行插入
- 插入之后进行修复,包括左旋、右旋、重新着色这些操作,让树保持平衡性
举个栗子,
首先放(10,”10”)
首先是put(10, “10”),由于此时TreeMap中没有任何节点,因此10为根且根节点为黑色节点
接着是put(85, “85”),这一步也不难,85比10大,因此在10的右节点上,但是由于85不是根节点,因此会执行fixAfterInsertion方法进行数据修正
默认插入的节点必须是红色的,以此来维持红黑树的性质(3)
当然插入节点着色为红色节点后,有可能导致的问题是违反性质(2),即出现连续两个红色节点,这就需要通过旋转操作去改变树的结构,解决这个问题。
阅读全文
0 0
- TreeMap相关详解
- TreeMap排序相关
- TreeMap的相关运用
- HashMap和TreeMap详解
- TreeMap红黑树源码详解
- 集合系列--TreeMap实现详解
- TreeMap
- TreeMap
- treeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- TreeMap
- treemap
- treemap
- TreeMap
- 随机验证码的各种实现方法
- matlab快速入门5——控制语句
- java泛型
- Tempter of the Bone(深度搜索)
- 技术文章 | 黑客教你如何在Windows上运行Linux桌面应用程序
- TreeMap相关详解
- JMX创建与连接(二)
- 拼接SQL语句[Oracle]
- ios 简单实现半圆形仪表盘 (进度条)
- Type interface mapper.UserMapper is not known to the MapperRegistry.
- Rhel7服务控制
- PHPExcel exception: “Could not close zip file … ”
- Treap
- ORACLE sql调优之记录一次trim函数引发的大表全表扫描