关于调用方法传入实参的一些误解
需求:通过调用noRepeat()方法对集合list去重
public class Test_4_2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("c");
list.add("c");
list.add("a");
list.add("d");
noRepeat(list);
System.out.println(list);
}
public static void noRepeat(List<String> al){
ArrayList<String> list2 = new ArrayList<String>();
for (int i = 0; i <al.size(); i++) {
if (!list2.contains(al.get(i))) {
list2.add(al.get(i));
}
}
al=list2;
}
}
在做这道题的过程中,出现的问题如上述代码.在noRepeat方法中,形参为List类型集合,在方法中创建list2集合存储了不重复的元素,而该方法的返回值为void,因此,在最后我直接将list2的地址值赋
给al.运行改程序,发现list集合并没有改变.事实上,在方法的形参实际语句为: List<String> al =list;
将list集合的地址值赋值给参数al,然后用al去操作集合.在最后,al=list2并不会对list产生影响,因此要想改变结果,必须通过al改变集合,或者把void改为由返回值的list并用自己来接收
解决方法1:
al.clear();
al.addAll(list2);
解决方法2:
return list2;
list=noRepeat(list);
因此,可以看出,调用方法要对集合或者数组进行操作,若返回值为void,则需要直接对该集合进行操作.若返回值为集合,则可以返回新集合的地址值并在main中调用方法并接收.