我的遍历方法不会传递 int 的值,但可以传递 ArrayList 的值

my traverse method wont pass down the value of int but can pass down the value of ArrayList

我的天感觉告诉我答案是"Integer and String are immutable",但我想在这里得到专家的确认。

我有一个遍历方法,基本上是从根开始遍历整棵树。这里有两种用法,第一种不起作用,总是return 0,第二种起作用,结果ArrayList可以在遍历中累加。

这是第一个:

public int whateverSum(TreeNodeType root, int target) {
    int sum = 0;
    traverse(root, target, sum);
    return sum;
}

这是第二个:

public List<String> whateverSum(TreeNode root, int target) {
    List<String> result = new ArrayList<String>();
    traverse(root, target, result);
    return result;
}

请帮我确认一下我的想法是否正确。

你没看错。实际上,遍历方法传递的是一个int的值,而不是ArrayList的值。

好吧,发生的是值和引用之间的差异。当您将一个 int 传递给一个函数时,该值将被复制。该函数访问值的副本。它以任何可能的方式使用它,但最终所有操作都是针对值的副本完成的,而没有修改原始值。

当您将对象传递给函数时,您传递的是对它的引用,就像内存地址一样。这是有道理的,因为当您传递数百万项的 ArrayList 时,您不希望每次都复制数百万项。所以,复制的是这个对象的引用,指向原来的结构。

这就是为什么当您将 int 传递给函数时,原始值永远不会被修改。而当您传递一个 ArrayList 时,它的内容将会改变。

现在,并不是所有的对象都是这样的,这就是不可变对象的来源。你说 String 是不可变的,这很好用。因此,当您对 String 进行修改时,它会被复制并且原始值也不会改变。 Integer 或 Double 等类型也是不可变的。这很有意义,因为当您递增整数时,您不希望程序中的所有 1 都变成 2。

关于您的代码,为了使第一种方法起作用,您可以执行以下操作:

public int whateverSum(TreeNodeType root, int target) {
    int sum = traverse(root, target, 0);
    return sum;
}

其中遍历 returns 更新后的总和。