问题概述
在java中,基本数据类型传递的是基本数据类型的值,而引用数据类型传递的是地址值。在赋值等操作中,要格外注意基本数据类型和引用数据类型的区别。
项目场景
leetcode 102. 二叉树的层序遍历
给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。
代码分析
使用BFS法,代码如下。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
List<Integer> resI = new ArrayList<>();
if(root == null) {
return res;
}
queue.add(root);
while(true) {
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
if(temp == null) {
continue;
}
resI.add(temp.val);
queue2.add(temp.left);
queue2.add(temp.right);
}
if(resI.isEmpty()) {
break;
}
Queue<TreeNode> tempQueue = new LinkedList<>(queue);
queue = new LinkedList<>(queue2);
queue2 = new LinkedList<>(tempQueue);
res.add(resI);
resI = new ArrayList<>(); //输出正确结果
// while(!resI.isEmpty()) {
// resI.remove(resI.size() - 1);
// } //输出全部为空
}
return res;
}
}
resI
为引用数据类型,执行res.add(resI);
后,resI
的地址值传给了res
。接下来:
如果执行resI = new ArrayList<>();
,新的地址值赋给resI
,则之后对resI
的修改不会影响原来的res
。输出结果正确。
如果执行while(!resI.isEmpty()) {resI.remove(resI.size() - 1);}
,虽然同样将resI
置空,但是在原来的resI
上对其进行修改,resI
地址值不变,所以会影响res
。虽然可以输出正确的层数,但每层都为空,因为res
中每个元素都指向resI
,而程序运行结束时resI
为空。
结论
引用数据类型传递的是地址值,在使用时要格外注意。应该用拷贝的方法传递数据,而不是直接赋值,否则很容易出现错误。