这是我在StackOverFlow上遇到的第一个问题:
我正在借助“破解代码面试”(第5版)这本书来研究面试,
我正在解决下一个问题:



在继续之前,我只想提醒您一个二叉搜索树与一个简单的二叉树之间的区别:



因此,本书提供的解决方案之一是按顺序遍历树,并动态检查我们访问的每个节点是否都大于最后一个节点,并且假定树不能有重复的值:

public static int last_printed = Integer.MIN_VALUE;
public static boolean checkBST(TreeNode n) {
    if(n == null) return true;

        // Check / recurse left
        if (!checkBST(n.left)) return false;

        // Check current
        if (n.data <= last_printed) return false;
        last_printed = n.data;

        // Check / recurse right
        if (!checkBST(n.right)) return false;

        return true; // All good!
}

现在,这里一切都很好,但是书中引述了以下内容:


Class WrapInt {
    public int value;
}

在遍历这里和其他网站的包装器类之后,我无法得出结论,为什么以及为什么我应该在这里使用包装器类而不是静态变量?

最佳答案

通过这种机制,您可以创建WrapInt实例,并将其传递给周围。然后,仅将值公开给应该知道该值的代码,而不是可以从任何地方访问和更改的公共(public)静态非最终变量。

之所以拥有包装器类,是因为Java原语是按值传递的;传递一个int然后更新它不会将更改传播到系统的其余部分。

看起来像这样:

public static boolean checkBST(TreeNode n) {
    WrapInt counter = new WrapInt();
    return checkBST(n, counter);
}

public static boolean checkBST(TreeNode n, WrapInt counter) {
    if(n == null) return true;

        // Check / recurse left
        if (!checkBST(n.left, counter)) return false;

        // Check current
        if (n.data <= counter.value) return false;
        counter.value = n.data;

        // Check / recurse right
        if (!checkBST(n.right, counter)) return false;

        return true; // All good!
}

关于java - 使用包装器类而不是静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29770749/

10-10 10:41