我的上帝的感觉告诉我答案是“整数和字符串是不可变的”,但我想得到专家的确认。
我有一个遍历方法,它基本上将从根开始遍历整个树。这里有两种用法,第一种不会工作,总是返回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;
}
请帮我确认我的想法是否正确。
答案 0 :(得分:2)
你做对了。实际上,会发生的是遍历方法传递int的值但不传递ArrayList的值。
嗯,会发生什么是值和参考之间的差异。将int传递给函数时,将复制该值。该函数访问值的副本。它以任何可能的方式使用它,但最终所有操作都是对值的副本完成的,而不修改原始文件。
当您将Object传递给函数时,您将传递对它的引用,就像内存地址一样。这是有道理的,因为当您传递数百万个项目的ArrayList时,您不希望每次都复制数百万个项目。因此,正在复制的是对此Object的引用,它指向原始结构。
这就是为什么当你将int传递给函数时,原始值永远不会被修改。而当您传递ArrayList时,其内容将会更改。
现在,并非所有对象都以这种方式运行,这是不可变对象的来源。你说String是不可变的,这非常方便。因此,当您对String进行修改时,会复制它并且原始值也不会更改。 Integer或Double等类型也是不可变的。它很有意义,因为当你递增一个整数时,你不希望你的所有1个程序变成2个。
关于您的代码,为了使第一个方法有效,您可以执行以下操作:
public int whateverSum(TreeNodeType root, int target) {
int sum = traverse(root, target, 0);
return sum;
}
其中traverse返回更新的总和。