关于调用方法传入实参的一些误解

   需求:通过调用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中调用方法并接收.​​​​

posted @ 2018-03-07 23:15  doveshelly  阅读(204)  评论(0编辑  收藏  举报