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

时间:2016-05-17 07:01:43

标签: java int immutability traversal

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

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

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

1 个答案:

答案 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返回更新的总和。