如何将int[]数组转换为列表?
2022-09-02 19:15:39
我期望此代码显示:true
int[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));
我期望此代码显示:true
int[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));
方法Arrays.asList(T ...)
是,当泛型被擦除和varargs被转换时,实际上等于一个类型的方法(这是二进制等效的,同一方法的JDK 1.4版本)。Arrays.ofList(Object[])
基元数组是一个(另请参阅此问题),但不是 ,因此编译器认为您正在使用 varargs 版本,并在 int 数组周围生成一个 Object 数组。您可以通过添加一个额外的步骤来说明正在发生的事情:Object
Object[]
int[] array = {1, 2};
List<int[]> listOfArrays = Arrays.asList(array);
System.out.println(listOfArrays.contains(1));
这将编译并等效于您的代码。它显然也返回 false。
编译器将 varargs 调用转换为具有单个数组的调用,因此调用需要参数参数的 varargs 方法等效于调用它,但这里的特殊情况是,如果方法需要对象数组,则在创建数组之前,具有基元的 varargs 将自动装箱。因此,编译器认为int数组作为单个Object传入,并创建一个类型的单元素数组,并将其传递给。T ...
T t1, T t2, T t3
new T[]{t1, t2, t3}
Object[]
asList()
所以这里再次是上面的代码,编译器在内部实现它的方式:
int[] array = {1, 2};
// no generics because of type erasure
List listOfArrays = Arrays.asList(new Object[]{array});
System.out.println(listOfArrays.contains(1));
以下是使用int值调用的一些好方法和坏方法:Arrays.asList()
// These versions use autoboxing (which is potentially evil),
// but they are simple and readable
// ints are boxed to Integers, then wrapped in an Object[]
List<Integer> good1 = Arrays.asList(1,2,3);
// here we create an Integer[] array, and fill it with boxed ints
List<Integer> good2 = Arrays.asList(new Integer[]{1,2,3});
// These versions don't use autoboxing,
// but they are very verbose and not at all readable:
// this is awful, don't use Integer constructors
List<Integer> ugly1 = Arrays.asList(
new Integer(1),new Integer(2),new Integer(3)
);
// this is slightly better (it uses the cached pool of Integers),
// but it's still much too verbose
List<Integer> ugly2 = Arrays.asList(
Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)
);
// And these versions produce compile errors:
// compile error, type is List<int[]>
List<Integer> bad1 = Arrays.asList(new int[]{1,2,3});
// compile error, type is List<Object>
List<Integer> bad2 = Arrays.asList(new Object[]{1,2,3});
参考:
但是要以简单的方式实际解决您的问题:
在Apache Commons / Lang(参见Bozho的答案)和Google Guava中有一些库解决方案:
Ints.contains(int[], int)
检查 int 数组是否包含给定的 intInts.asList(int ...)
从整型数组创建整数列表将生成 一个 单例列表。Arrays.asList(array)
int[]
如果更改为 ,它将按预期工作。不知道这是否对你有帮助。int[]
Integer[]