treemap是一个直接由红黑树实现的结构,对于key值得比较来排序,显然得到:
1.key的class必须实现comparable方法, 不能抛出classcastexception异常,否则必须指定一个comprartor
2.由于treemap实现了rializable接口,所以默认的或者自定义的comparator也应该实现该接口
最重要的是,实现了navigablemap,我理解为导航map,提供了各种操作map视图的操作
public class treemap<k,v> extends abstractmap<k,v> implements navigablemap<k,v>, cloneable, java.io.rializable{}复制代码
四个构造方法,其实就是是否使用默认的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.entryt().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; el if (t.right != null) { entry<k,v> p = t.right; while (p.left != null) p = p.left; retargetedturn p; } el { 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; el return p; } el if (cmp > 0) { //比当前节点大,再跟右子节点比较 if (p.right != null) { p = p.right; } el { //这里跟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; } } el //相等的话返回当前节点 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; el return p; } el if (cmp < 0) { //比当前节点小,再跟左子节点比较 if (p.left != null) { p = p.left; } el { entry<k,v> parent = p.parent; entry<k,v> ch = p; //比最左叶子小,下一个为当前子树的父节点 while (parent != null && ch == parent.left) { honey的意思 ch = parent; parent = parent.parent; } return parent; } } el //相等的话返回当前节点 return p; } return null;}复制代码
跟getceilingentry一样的只不过对于相等的情况,不考虑相等的情况
final entry<k,v> gethigherentry(k key) { entry<k,v>qq美女图片大全 p = root; while (p != null) { int cmp = compare(key, p.key); if (cmp < 0) { if (p.left != null) p = p.left; el return p; } el { if (p.right != null) { p = p.right; } el { 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 rialversionuid = 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() { r指望的意思eturn 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相同,只是相反的实现
本文发布于:2023-04-05 04:13:38,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/f494a125b4952d0d2c059d93fb5f67db.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java源码解析(java新手代码大全).doc
本文 PDF 下载地址:java源码解析(java新手代码大全).pdf
留言与评论(共有 0 条评论) |