gpt4 book ai didi

java - 我的 traverse 方法不会传递 int 的值,但可以传递 ArrayList 的值

转载 作者:行者123 更新时间:2023-12-02 03:37:27 30 4
gpt4 key购买 nike

我的上帝感觉告诉我答案是“整数和字符串是不可变的”,但我想得到这里专家的确认。

我有一个遍历方法,它基本上会从根开始遍历整个树。这里有两种用法,第一种不起作用,总是返回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;
}

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

最佳答案

你说得对。事实上,发生的情况是 traverse 方法传递的是 int 的值,而不是 ArrayList 的值。

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

当您将对象传递给函数时,您正在传递对其的引用,就像内存地址一样。这是有道理的,因为当您传递包含数百万个项目的 ArrayList 时,您不希望每次都复制这些数百万个项目。因此,被复制的是对此对象的引用,它指向原始结构。

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

现在,并非所有对象都以这种方式运行,这就是不可变对象(immutable对象)的由来。你说字符串是不可变的,这非常方便。因此,当您对字符串进行修改时,它会被复制,并且原始值也不会改变。 Integer 或 Double 等类型也是不可变的。这很有意义,因为当您递增整数时,您不希望程序中的所有 1 都变成 2。

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

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

其中 traverse 返回更新后的总和。

关于java - 我的 traverse 方法不会传递 int 的值,但可以传递 ArrayList 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37269242/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com