百度云一笑芳香沁套图38套+视频15部7.95G(严格按公式解析:平台用百度云替代百度规避禁用词,名字保留一笑芳香沁,类
百度云资源内收录一笑芳香沁全系列38套合集...
2025-09-18
TreeMap是一个直接由红黑树实现的结构,对于Key值得比较来排序,显然得到:
1.key的class必须实现comparable方法, 不能抛出ClassCastException异常,否则必须指定一个comprartor
2.由于TreeMap实现了Serializable接口,所以默认的或者自定义的comparator也应该实现该接口
最重要的是,实现了NavigableMap,我理解为导航map,提供了各种操作map视图的操作
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable{}复制代码四个构造方法,其实就是是否使用默认的compatator
对于无序Map,直接调用putAll,有序的SortedMap话递归调用buildFromSorted,提高效率
public TreeMap() { comparator = null;}public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }public TreeMap(Map<? extends K, ? extends V> m) { comparator = null; putAll(m);}public TreeMap(SortedMap<K, ? extends V> m) { comparator = m.comparator(); try { buildFromSorted(m.size(), m.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { }}复制代码但是putAll依然判断了map instanceof SortedMap
具体的红黑树的操作在此不作赘述
remove(),put()最根本的操作是红黑树的操作,get()也是二叉搜索树比较直观的实现
static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) { // 首先明确,下个节点是比当前节点大的节点,为当前节点右节点的左叶子节点 if (t == null) return null; else if (t.right != null) { Entry<K,V> p = t.right; while (p.left != null) p = p.left; return p; } else { Entry<K,V> p = t.parent; Entry<K,V> ch = t; // 当右节点为空,并且是父节点的右节点时,下个节点当前分支树的父节点 while (p != null && ch == p.right) { ch = p; p = p.parent; } // 当右节点为空,并且是父节点的左节点时,下个节点当前节点的父节点 return p; }}复制代码// 这个跟successor是相似的,其实如果根据搜索树没找到,就是找的下一个节点final Entry<K,V> getCeilingEntry(K key) { Entry<K,V> p = root; while (p != null) { int cmp = compare(key, p.key); //比当前节点小,再跟左子节点比较 if (cmp < 0) { if (p.left != null) p = p.left; else return p; } else if (cmp > 0) { //比当前节点大,再跟右子节点比较 if (p.right != null) { p = p.right; } else { //这里跟successor相同,比最右叶子大,下一个为当前子树的父节点 Entry<K,V> parent = p.parent; Entry<K,V> ch = p; while (parent != null && ch == parent.right) { ch = parent; parent = parent.parent; } return parent; } } else //相等的话返回当前节点 return p; } return null;}//跟上面是镜像的过程final Entry<K,V> getFloorEntry(K key) { Entry<K,V> p = root; while (p != null) { int cmp = compare(key, p.key); //比当前节点大,跟右子节点比较 if (cmp > 0) { if (p.right != null) p = p.right; else return p; } else if (cmp < 0) { //比当前节点小,再跟左子节点比较 if (p.left != null) { p = p.left; } else { Entry<K,V> parent = p.parent; Entry<K,V> ch = p; //比最左叶子小,下一个为当前子树的父节点 while (parent != null && ch == parent.left) { ch = parent; parent = parent.parent; } return parent; } } else //相等的话返回当前节点 return p; } return null;}复制代码跟getCeilingEntry一样的只不过对于相等的情况,不考虑相等的情况
final Entry<K,V> getHigherEntry(K key) { Entry<K,V> p = root; while (p != null) { int cmp = compare(key, p.key); if (cmp < 0) { if (p.left != null) p = p.left; else return p; } else { if (p.right != null) { p = p.right; } else { Entry<K,V> parent = p.parent; Entry<K,V> ch = p; while (parent != null && ch == parent.right) { ch = parent; parent = parent.parent; } return parent; } } } return null;}复制代码底层由DescendingSubMap()实现,其实还是这个map,只不过对于所有的操作,比如getfist(),会将其转换为getLast()来执行,所以对于DescendingMap()的操作依然会影响原Map
同样的,subMap()的操作也会影响原Map
static final class DescendingSubMap<K,V> extends NavigableSubMap<K,V> { private static final long serialVersionUID = 912986545866120460L; // m是当前Map,fromStart是否从头开始为ture则lo为null,lo开始位置,loInclusive是否包含开始位置 DescendingSubMap(TreeMap<K,V> m, boolean fromStart, K lo, boolean loInclusive, boolean toEnd, K hi, boolean hiInclusive) { super(m, fromStart, lo, loInclusive, toEnd, hi, hiInclusive); }复制代码//DescendingSubMap一些方法的实现TreeMap.Entry<K,V> subLowest() { return absHighest(); }TreeMap.Entry<K,V> subHighest() { return absLowest(); }TreeMap.Entry<K,V> subCeiling(K key) { return absFloor(key); }TreeMap.Entry<K,V> subHigher(K key) { return absLower(key); }TreeMap.Entry<K,V> subFloor(K key) { return absCeiling(key); }TreeMap.Entry<K,V> subLower(K key) { return absHigher(key); }复制代码正常map调用的是AscendingSubMap,跟DescendingMap相同,只是相反的实现

以上内容就是为大家推荐的java源码解析(java新手代码大全)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:java源码解析(java新手代码大全)
本文地址:https://www.xiaoyin02.com/shcs/115731.html
相关文章
手机怎么安装qq,支持java的手机怎么安装qq? 用手机的浏览器打开3g.qq.com然后选择QQ找到下载选择品牌机型如果没有的话可以下载通用版根据屏幕尺寸下载...
2023-04-20
手机解析包怎么,小米11安装游戏出现解析包错误? 删除安装包,打开安全中心,清理一下手机; 2.重新下载软件安装包,然后再进行安装; 3.如果还无法...
2023-04-19
惠头条怎么解绑手机号,惠头条高清无水印视频解析下载工具有哪些? 把你的视频复制分享链接。电脑上安装固乔视频助手,然后连接粘贴进去,就能一键...
2023-04-15
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)