为什么 Collections.reverse() 不支持原始数据类型(int、long)?

Why doesn't Collections.reverse() support primitive datatypes (int, long)?

所以我试图用 Collections.reverse() 反转一个 int[] 数组。 它不适合我。数组以相同的方式打印。

示例:

int[] arr = {1, 2, 3 ,4};

Collections.reverse(Arrays.asList(arr));

打印数组后的输出: 1 2 3 4

我一直想知道为什么会这样? 如果我使用 Integer[] 数组而不是 int[],它会完全反转。 知道为什么会这样吗?

描述

方法来自java.util.Collectionsclass

public static void reverse(List<?> list) 

Reverses the order of the elements in the specified list.

Parameters:
list - the list whose elements are to be reversed.

上面提到的描述可以找到here

对于这个问题,很明显该方法需要传递列表,而不是数组(无论是原始数组还是非原始数组或包装数组)

示例和解释

下面的例子java source 让我们把它命名为TestReverse.java

import java.util.*;

public class TestReverse {
    public static void main(String[] args) {
        final int n = 4;
        Integer[] arr = new Integer[n];
        for(var i = 0; i < n; i++) 
            arr[i] = i;
        System.out.println("Initially : " + Arrays.toString(arr));

        Collections.reverse(arr);   // show Complier Error at this point.

        System.out.println("Later : " + Arrays.toString(arr));
    }
}

当运行即javac -Xdiags:verbose TestReverse.java

以上代码会产生编译错误

TestReverse.java:10: error: method reverse in class Collections cannot be applied to given types;
        Collections.reverse(arr);
                   ^
  required: List<?>
  found: Integer[]
  reason: argument mismatch; Integer[] cannot be converted to List<?>
1 error

这很明显,因为该方法需要一个列表但发现是一个数组(在本例中为整数数组)。

解决方案

如果您仍想使用该方法并将其反转,则使该数组像列表一样工作,可以通过 Arrays.asList(arrayOfAnyType)

因此,反转将是:Collections.reverse(Arrays.asList(arr));
使arr数组反转。
这里 Arrays.asList(arr) 的时间为 O(1),Collections.reverse(list) 的时间为 O(1)。

其他替代方法是手动交换元素,没有任何方法的帮助(这也是非常流行和老派的类型)时间复杂度为 O(n),

for(var i = 0; i < arr.length/2; i++) {
    var tmp = arr[i];
    arr[i] = arr[arr.length - (i+1)];
    arr[arr.length - (i+1)] = tmp;
}