Java 如何将int[]数组转换为列表?

Java 如何将int[]数组转换为列表?,java,arrays,collections,Java,Arrays,Collections,我希望此代码显示true: int[] array = {1, 2}; System.out.println(Arrays.asList(array).contains(1)); 我认为没有一个方法调用可以使用。像这样试试 List<Integer> list = new ArrayList<Integer>(); for (int index = 0; index < array.length; index++) { list.add(array

我希望此代码显示
true

int[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));

我认为没有一个方法调用可以使用。像这样试试

List<Integer> list = new ArrayList<Integer>();
  for (int index = 0; index < array.length; index++)
  {
    list.add(array[index]);
  }
List List=new ArrayList();
for(int index=0;index
数组.asList(array)将生成一个
int[]
的单例列表

如果将
int[]
更改为
Integer[]
,它将按照您的预期工作。我不知道这是否对你有帮助

Arrays.asList(ArrayUtils.toObjectArray(array))
ArrayUtils
来自)

但是,如果您只想调用
contains
,则不需要这样做。只需使用数组。binarySearch(..)(首先对数组排序)

System.out.println(Arrays.asList(array).contains(array));
返回
true

当删除泛型并转换varargs时,该方法实际上等于
Arrays.ofList(Object[])
类型的方法(它是相同方法的二进制等效JDK 1.4版本)

原语数组是
对象
(另请参见),但不是
对象[]
,因此编译器认为您使用的是varargs版本,并围绕int数组生成一个对象数组。您可以通过添加一个额外步骤来说明发生了什么:

int[] array = {1, 2};
List<int[]> listOfArrays = Arrays.asList(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});
//这些版本使用自动装箱(这可能是有害的),
//但它们简单易读
//整数被装箱为整数,然后包装在对象[]中
List good1=Arrays.asList(1,2,3);
//这里我们创建一个整数[]数组,并用装箱整数填充它
List good2=Arrays.asList(新整数[]{1,2,3});
//这些版本不使用自动装箱,
//但它们非常冗长,根本不可读:
//这很糟糕,不要使用整数构造函数
List ugly1=Arrays.asList(
新整数(1)、新整数(2)、新整数(3)
);
//这稍微好一点(它使用缓存的整数池),
//但还是太冗长了
List ugly2=Arrays.asList(
Integer.valueOf(1)、Integer.valueOf(2)、Integer.valueOf(3)
);
//这些版本会产生编译错误:
//编译错误,类型为List
List bad1=Arrays.asList(新的int[]{1,2,3});
//编译错误,类型为List
List bad2=Arrays.asList(新对象[]{1,2,3});
参考资料:

  • >>>

但要用一种简单的方式实际解决您的问题:

Apache Commons/Lang(请参阅)和中有一些库解决方案:

  • 检查整数数组是否包含给定的整数
  • 从整数数组创建整数列表
当你打电话时

Arrays.asList(array)

在原语数组中,您会得到一个包含一个对象的列表实例:一个int值数组!正如@Bozho在他的回答中所建议的那样,您必须首先将原语数组转换为对象数组。

您对
数组的理解似乎是错误的。asList(T…a)
。你不会是第一个对它的工作原理做出假设的人

试一下

System.out.println(Arrays.asList(1, 2).contains(1));

在这种情况下,自动装箱无法按您希望的方式工作。以下代码可能有点冗长,但执行将int数组转换为列表的任务:

List<Integer> list = new ArrayList<Integer>(array.length);
for (int value : array) {
    list.add(value);
}
List List=newarraylist(array.length);
for(int值:数组){
列表。添加(值);
}

如果只想检查数组是否包含特定元素,只需在数组上迭代并搜索元素即可。这将需要o(n/2)。所有其他解决方案都不那么有效。任何将数组复制到列表的方法都必须在数组上迭代,因此此操作只需要n个原子赋值

以下代码显示为真:

Integer[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));

(您的版本失败,因为Int不是being对象,但Int[]是一个对象。因此,您将使用一个元素being集合调用asList(T…a),因为集合a是不可能的。)

这是将数组转换为List的方法。只要记住这个列表是不可变的。尝试输出列表的内容,您将看到它包含1和2value@Shervin:你自己试试看,你会发现它不是。也许我们可以添加ArrayUtils是apache commons的一部分:对不起,我是时间旅行盲。现在是:Arrays.asList(ArrayUtils.toObject(array))
Integer[]
也是一个对象。我知道,但它也是一个
object[]
,这是一个更好的匹配方式,即用甜蜜的painint[]刺痛的对象不能转换为object[](请参阅),而是转换为object。任何将数组复制到list的方法都必须在数组上迭代,而数组不是true
Arrays.asList()
使用提供的数组来支持列表,因此它只会在搜索时迭代,正如您所建议的那样,这是非常古老的代码。关于这个问题的更现代的版本,请参见《罗布班的答案》
Integer[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));