Java值传递和引用传递
DFS所遇BUG
进行一个DFS时,遇到了进行参数传递时直接传了ArrayList类型(C++习惯),但是发现DFS中所有ArrayList都指向了一个,看测试代码:
import org.omg.PortableInterceptor.INACTIVE;
import java.util.ArrayList;
import java.util.Vector;
/**
* @Author Yuri
* @Date 2020/11/26 13:51
* @Version 1.0
* @Description:
*/
public class Test {
static Integer n = 0;
public static void dfs(int k, ArrayList<Integer> arrayList) {
arrayList.add(k);
// ArrayList<Integer> arrayList = new ArrayList<Integer>(al);
// arrayList.add(k);
if (k == 5) return;
System.out.println(++n + ": " + arrayList);
for (int i = 0; i < 3; i++) {
dfs(k + 1, arrayList);
}
}
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
dfs(1, new Ar
rayList<Integer>());
}
}
输出结果:
总结原因是没搞清Java的值传递和引用传递。
Java值传递和引用传递
定义
值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。
指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。(C++)
Java各类型的传递规则
boolean | byte | char | short | Int | long | float | double |
---|---|---|---|---|---|---|---|
Boolean | Byte | Character | Short | Integer | Long | Float | Double |
- 八大基本类型都是值传递
- 需要new的(ArrayList、Vector...)都是引用传递
- String、包装类型虽然是引用传递,但是效果是值传递。