關於調用方法傳入實參的一些誤解
需求:通過調用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中調用方法並接收.????
關於調用方法傳入實參的一些誤解