zookeeper源码解析(九)

2021SC@SDUSC

前言

本节介绍PathTrie类的静态内部类TrieNode,即字典树的节点类

TrieNode

成员变量

         //节点存储的值
         final String value;
         //Map,存储子节点的value到子节点的映射
         final Map<String, TrieNode> children;
         //property为true,当且仅当对应的路径(从根节点到该节点)存在
         boolean property;
         //节点的父节点
         TrieNode parent;

构造函数:

         //private构造函数,只对当前外部类开放
         private TrieNode(TrieNode parent, String value) {
             this.value = value;
             this.parent = parent;
             this.property = false;
             //初始化容量为4,平衡内存消耗与哈希表的更新效率
             this.children = new HashMap<>(4);
         }

parent,property的get/set方法,value的get方法:

         TrieNode getParent() {
             return this.parent;
         }

         
         void setParent(TrieNode parent) {
             this.parent = parent;
         }

         
         void setProperty(boolean prop) {
             this.property = prop;
         }

        
         boolean hasProperty() {
             return this.property;
         }

         
         public String getValue() {
             return this.value;
         }

addChild,deleteChild方法:

         //事实上在zookeeper中调addChild前总会先判断hashmap中是否已有对应的key
         //但该函数的实现依然是用了putIfAbsent来保证健壮性
         void addChild(String childName, TrieNode node) {
             this.children.putIfAbsent(childName, node);
         }

         
         
         void deleteChild(String childName) {
             this.children.computeIfPresent(childName, (key, childNode) -> {
                 //删除一个子节点,首先子节点一定是propety设为false
                 childNode.setProperty(false);
                 
                 //而子节点对象是否要删除,要取决于该子节点是否是叶子节点
                 //如果该子节点没有子节点,那么就可以直接在hashmap中删除它了
                 if (childNode.isLeafNode()) {
                     childNode.setParent(null);
                     return null;
                 }

                 return childNode;
             });
         }

getChild,getChildren方法:

         //根据子节点存的值,来获取该节点的子节点
         TrieNode getChild(String childName) {
             return this.children.get(childName);
         }

         
         //获取该节点的子节点们存储的值集合
         Collection<String> getChildren() {
             return children.keySet();
         }

isLeafNode方法:

         //判断该节点是否是叶子节点,通过children是否为空(即该节点是否有子节点)
         boolean isLeafNode() {
             return children.isEmpty();
         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值