Java数据结构-TreeMap
来源:互联网 发布:河北干部网络学校app 编辑:程序博客网 时间:2024/06/06 01:33
内部结构图
通常称之为红黑树(平衡二叉树)(红黑树(平衡二叉树)是一种特殊的排序二叉树)
实现原理
由于红黑树过于复杂,下诉实现原理只是排序二叉树的原理,红黑树以此类似。
TreeMap内部维护着一个Entry<K,V>
对象,该对象包含五个属性,
K key; 调用put方法的时候传的keyV value; 调用put方法的时候传的valueEntry<K,V> left = null; 左节点Entry<K,V> right = null; 右节点Entry<K,V> parent; 父节点boolean color = BLACK; 节点颜色
当我们往TreeMap中put值时,第一个put的值会作为跟节点,往后put的值会拿put的key和根节点的key做比较,如果新key>根key,则拿新key和根节点的右节点做比较,如果小于,则又和左节点做比较,如果等于,则替换节点的值,直到节点为null,就把新的作为此节点,如此反复,就会形成图中的结构。
关于红黑树:这种排序二叉树在极端情况下(程序员本身插入的key就是有序的)(比如我们插入的key是abcdefg…)的时候,就有可能形成
这种链状引用,这个时候进行检索效率是非常低下的(类似于链状结构检索),所以为了解决这个问题,java中的TreeMap使用的是红黑树结构,红黑树具体实现原理过于复杂,涉及树的旋转之类。本文不诉,具体是当我们插入的是abcdefg这种本身就是有序的,形成的结构不是引用的,而是类似于
这种相对平衡的结构。这样检索的时候就相对较快。
特点
1.有序,顺序是根据插入的key的顺序来排的。
2.无法插入null的key
3.TreeMap通常比HashMap慢一点(树和哈希表的数据结构使然)
常用方法源码
put(K key, V value)
public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { compare(key, key); //检查key不能为null root = new Entry<>(key, value, null);//第一次put的时候创建根节点 size = 1; modCount++; return null; } int cmp; Entry<K,V> parent; Comparator<? super K> cpr = comparator;//程序员自定义的排序 if (cpr != null) { do { parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } else { if (key == null) throw new NullPointerException(); Comparable<? super K> k = (Comparable<? super K>) key; do {//递归比较新key是放入左节点还是右节点 parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else parent.right = e; fixAfterInsertion(e);//修复红黑树 size++; modCount++; return null; }
get(Object key)
public V get(Object key) { Entry<K,V> p = getEntry(key); return (p==null ? null : p.value); }final Entry<K,V> getEntry(Object key) { // Offload comparator-based version for sake of performance if (comparator != null) return getEntryUsingComparator(key); if (key == null) throw new NullPointerException(); Comparable<? super K> k = (Comparable<? super K>) key; Entry<K,V> p = root; while (p != null) {//递归直到找到对应的元素 int cmp = k.compareTo(p.key); if (cmp < 0) p = p.left; else if (cmp > 0) p = p.right; else return p; } return null; }
0 0
- Java数据结构-TreeMap
- java数据结构之TreeMap
- Java常用数据结构之TreeMap
- java数据结构之树集TreeSet与书映射(TreeMap)
- java数据结构之树集TreeSet与书映射(TreeMap)
- java TreeMap
- Java TreeMap
- Java TreeMap
- java TreeMap
- 数据结构思维 第十二章 `TreeMap`
- 数据结构Map之TreeMap分析
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- Java源码集合类TreeMap学习1——数据结构1
- Java源码集合类TreeMap学习1——数据结构2
- java数据结构(二)——Set(HashSet,TreeSet),泛型,Map(HashMap,TreeMap)
- java数据结构(二)——Set(HashSet,TreeSet),泛型,Map(HashMap,TreeMap,ConcurrentHashMap)
- Java源码集合类TreeMap学习1——数据结构3二叉树创建代码
- Java源码集合类TreeMap学习1——数据结构4平衡二叉树的旋转
- 第十周-项目二 二叉树遍历的递归算法
- 监控的shell脚本阻塞
- DirectX开发学习简记
- android四种定位方式
- 【第九周项目4-广义表算法库及应用】
- Java数据结构-TreeMap
- 第10周项目3-利用二叉树遍历思想解决问题(1)计算二叉树节点个数
- 第八周项目3 顺序串算法
- netmap源码分析(二)内核态关键结构的初始化
- Spring实战-注解切面(五)
- 第八周 项目一 建立顺序串的算法库
- centos7 install samba
- mongodb,memcached与redis在win7下的使用
- sensor总结三(sensor校准)