arraylist作为方法参数传递的是引用的副本,可修改内容但不能改变原引用指向;应优先使用list接口声明参数,避免裸类型,必要时传不可变视图或副本以防止意外修改。

ArrayList 作为方法参数传递时,本质上传递的是引用的副本,不是对象本身,也不是深拷贝。这意味着方法内可以修改它所指向的集合内容(比如 add、remove、set),这些修改会反映到原 ArrayList 上;但如果你在方法里让参数变量指向一个新对象(比如 list = new ArrayList()),这不会影响调用方的原始引用。
直接传引用:能改内容,不能换对象
这是最常用的方式。方法签名中声明为 ArrayList<string></string> 或更推荐的 List<string></string>(面向接口编程):
public void modifyList(List<string> list) {
list.add("new item"); // ✅ 原列表会新增元素
list.set(0, "changed"); // ✅ 原列表第一个元素被修改
list = new ArrayList(); // ❌ 不影响调用方的 list 变量
}</string>
调用时直接传入即可:
ArrayList<string> mylist = new ArrayList(Arrays.asList("a", "b"));
modifyList(mylist);
System.out.println(mylist); // 输出: [changed, b, new item]</string>
想避免意外修改?传不可变视图或副本
如果方法逻辑不应改动原始数据,有几种安全做法:
- 传
Collections.unmodifiableList(list)—— 方法里调用 add/remove 会抛UnsupportedOperationException - 传新副本:
new ArrayList(originalList)—— 方法可任意修改,不影响原列表 - Java 10+ 可用
List.copyOf(list)(返回不可变 List,且要求原 list 非 null)
注意泛型擦除与原始类型警告
不要用裸类型(raw type)如 ArrayList,应始终指定泛型,比如 ArrayList<integer></integer>。否则编译器会警告,运行时可能因类型不匹配导致 ClassCastException。方法参数也建议用 List<t></t> 而非 ArrayList<t></t>,提高灵活性和可测试性。
需要返回新列表?明确设计方法职责
如果方法本意是“基于输入生成新结果”,就别修改入参,而是返回新 ArrayList:
public List<string> filterUppercase(List<string> input) {
return input.stream()
.filter(s -> s.equals(s.toUpperCase()))
.collect(Collectors.toCollection(ArrayList::new));
}</string></string>
这样语义清晰,调用方自行决定是否赋值给原变量或新变量。











