我想知道是否有一种更有效的方式在数组中交换两个元素,而不是像这样做:
String temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;
嗯,这显然是坏事,甚至是错误的,但我需要经常交换所以我感兴趣,如果有任何Libs或提供更有效的方法来做到这一点?
Old*_*eon 32
这应该使它无缝:
public static final <T> void swap (T[] a, int i, int j) {
  T t = a[i];
  a[i] = a[j];
  a[j] = t;
}
public static final <T> void swap (List<T> l, int i, int j) {
  Collections.<T>swap(l, i, j);
}
private void test() {
  String [] a = {"Hello", "Goodbye"};
  swap(a, 0, 1);
  System.out.println("a:"+Arrays.toString(a));
  List<String> l = new ArrayList<String>(Arrays.asList(a));
  swap(l, 0, 1);
  System.out.println("l:"+l);
}
T.J*_*der 25
不.您可以使用一个函数使每个使用它的地方更简洁,但最后,完成的工作将是相同的(加上函数调用的开销,直到/除非HotSpot将其内联移动 - 以帮助它,做功能static final).
bhu*_*ng3 10
如果要交换字符串.它已经是有效的方法.
但是,如果要交换整数,可以使用XOR更有效地交换两个整数,如下所示:
int a = 1; int b = 2; a ^= b; b ^= a; a ^= b;
如果您正在交换数字并希望以简洁的方式编写代码而不创建单独的函数或使用令人困惑的XOR黑客,我发现这更容易理解,它也是一个单行.
public static void swap(int[] arr, int i, int j) {
    arr[i] = (arr[i] + arr[j]) - (arr[j] = arr[i]);
}
我从一些原始基准测试中看到的是,性能差异基本上可以忽略不计.
使用Collections.swap和Arrays.asList:
Collections.swap(Arrays.asList(arr), i, j);
就地交换(如果您已经不知道)可以通过不创建临时变量来节省一些空间。
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];