【问题标题】:How recursive inner static class get initialized?递归内部静态类如何初始化?
【发布时间】:2017-05-10 08:24:30
【问题描述】:

我正在研究 Trie 数据结构并遇到了这段代码

// R-way trie node
    private static class Node {
        private Object val;
        private Node[] next = new Node[26];
    }

我理解逻辑,但我不明白的是,节点将被初始化到什么深度?

您可以在http://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/TrieST.java.html查看完整代码

【问题讨论】:

  • 如果我理解思维方式,“非静态”内部类有特定的生命(隐藏的父“this”引用等),“静态”生命是正常的。

标签: java trie static-class


【解决方案1】:

在您的代码行中, 首先,您在 main 方法中使用 put(val1,val2) 命令插入值。

st.put(key, i);

下面put(val1,val2) 方法的代码行,

 public void put(String key, Value val) {
        if (val == null) delete(key);
        else root = put(root, key, val, 0);
    }

根据此代码行,递归 else 部分正在调用另一个 put(val1,val2,val3,val4) 方法

下面put(val1,val2,val3,val4)方法的代码行,

private Node put(Node x, String key, Value val, int d) {
        if (x == null) x = new Node();
        if (d == key.length()) {
            if (x.val == null) n++;
            x.val = val;
            return x;
        }
        char c = key.charAt(d);
        x.next[c] = put(x.next[c], key, val, d+1);
        return x;
    }

这里,当x==null 时,Node 对象正在使用new Node(); 进行初始化。

【讨论】:

    【解决方案2】:

    这里没有递归。

    private Node[] next = new Node[26];
    

    不创建任何Node 实例。它创建了一个包含 26 个元素的 Node[]Node 引用数组)。所有引用都初始化为空。数组引用的Node 实例必须在别处初始化。

    另一方面,如果您有一个成员初始化为:

    private Node n = new Node ();
    

    一旦创建Node 的第一个实例,这将导致无限递归。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2023-03-18
      • 2011-01-19
      • 2020-04-14
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多