You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向函数传入ArrayList实现类似Java数组的元素交换效果

ArrayList交换指定位置元素的报错解决

对于Java数组,我们可以通过如下方式交换索引first和second位置的元素:

public void func(int[] array) {
    int first = 1;
    int second = 2;
    swap(array, first, second);
}

public void swap(int[] array, int first, int second) {
    int tmp = array[first];
    array[first] = array[second];
    array[second] = tmp;
}

如果使用ArrayList,要如何实现相同的元素交换效果?
尝试编写的实现代码如下:

public void swap(ArrayList<Integer> array, int first, int second){
    int tmp = array.get(first);
    array.set(first, array.get(second));
    array.set(second, tmp);
}

运行时代码抛出如下错误:

error: non-static method swap(ArrayList,int,int) cannot be referenced from a static context
swap(A, i, j);


问题原因与解决方法

你写的ArrayList元素交换逻辑本身没有问题:数组用下标直接读写,ArrayList用get()读、set()写,二者交换元素的思路完全一致。
报错和ArrayList操作无关,核心是Java的静态方法调用规则:
你定义的swap是没有加static修饰的非静态成员方法,这类方法必须绑定类的实例对象才能调用。但你调用swap(A,i,j)的位置在静态上下文(最常见的就是main方法,或是其他被static修饰的方法)中,静态上下文不存在当前类的实例,因此无法直接调用非静态方法。

两种修复方案选其一即可:

  • 给swap方法加上static修饰符,将其改为静态方法,就可以直接在静态上下文中调用,修改后的方法签名为public static void swap(ArrayList<Integer> array, int first, int second)
  • 如果不希望修改方法为静态,可以先实例化当前类的对象,通过对象调用方法,示例:new Demo().swap(A, i, j)(Demo替换为你当前类的类名)

另外JDK自带的java.util.Collections工具类已经封装了通用的列表交换方法,直接调用Collections.swap(yourList, first, second)即可完成任意List实现类的指定位置元素交换,不需要手动写交换逻辑。


内容的提问来源于stack exchange,提问作者kalki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:27:34