java中函数传值和传地址的问题

Java与C++的一大区别,就是Java没有指针而C++有。如果硬要说的话,Java使用对象引用来替代指针。相信大家用Java在做深度优先搜索的题目时,一定会遇到函数传值和传地址的问题,下面我就通过例题来帮大家详细整理一下。

题目一:二叉树中和为某一值的路径,即输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

这道题的解法详见下面,其中有个问题就是java中值和址的问题。这里要详细说明。首先如果传的是int等基本数据类型和string,那么你使用下面的方法是改变不了a的值的:

class Solution{
   
    public void fun(int a){
   
        a++;
    }
    public static void main(String []args){
   
        int a=1;
        fun(a);
        System.out.println(a);
        //这里会输出a=1
    }
}

而其他的类都是传地址的,也就是说在函数外面定义TreeNode1=root,函数定义fun(TreeNode2){},这时候其实两个TreeNode是不一样的两个东西,只是指向的东西一样而已。也就是说你在函数里面是有可能改变这个类里面的某些属性的,比如在函数里面写TreeNode2.val=2,那么真正的val真的变成了2。但是如果你在函数里面令TreeNode2=root2,那么只是函数里面的TreeNode2换了一个东西指了而已,函数外面的TreeNode1还是指向的root。

例如在ArrayList<ArrayList< Integer >> ans中加入一个ArrayList temp,先add一个为【1,2】的temp,然后改变temp,变为【1,2,3】,再add。但是这时候ans里面的数据是【1,2,3】【1,2,3】,为什么呢,因为temp传的是地址,也就是说当temp改变为【1,2,3】之后,其实是temp指向的那块地方的东西变成了【1,2,3】,所以之前已经add进ans的数据也一起改变为【1,2,3】了。要解决这个问题,就要在每次add前新建一个ArrayList,把temp克隆过去clone,这样的话每个ArrayList指向的就是两个地址,其中一个改变不会影响令一个。

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
   
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
   
        if(root==null)
            return new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> ans =new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> temp=new ArrayList<Integer>();
        help(root,target,ans
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值