Java 将int[]转换为List的最佳方法<;整数>;在爪哇?

Java 将int[]转换为List的最佳方法<;整数>;在爪哇?,java,generics,collections,Java,Generics,Collections,可能重复: 如何实现此方法: List<Integer> toList(int[] integers) { ??? //return Arrays.asList(integers); doesn't work } List toList(int[]整数){ ??? //返回array.asList(整数);不工作 } 可能在某个地方有一个内置的方法*(正如您所注意到的,数组。asList不会像它期望的那样使用整数[]而不是int[]) 我对Java库不太了解,无法

可能重复:

如何实现此方法:

List<Integer> toList(int[] integers) {
    ???
    //return Arrays.asList(integers); doesn't work
}
List toList(int[]整数){
???
//返回array.asList(整数);不工作
}

可能在某个地方有一个内置的方法*(正如您所注意到的,
数组。asList
不会像它期望的那样使用
整数[]
而不是
int[]

我对Java库不太了解,无法告诉您它在哪里。但写自己的很简单:

public static List<Integer> createList(int[] array) {
    List<Integer> list = new ArrayList<Integer>(array.length);
    for (int i = 0; i < array.length; ++i) {
        list.add(array[i]);
    }
    return list;
}
公共静态列表createList(int[]数组){
列表列表=新的ArrayList(array.length);
对于(int i=0;i
显然,这样做的一个缺点是,你不能一般地这样做。您必须为所需的每个自动装箱原语类型编写一个单独的
createList
方法

*如果没有,我真的想知道为什么没有。

列出toList(int[]整数){
//将结果的大小初始化为传入数组的长度
//这样就不需要重新分配
ArrayList结果=新的ArrayList(integers.length);
for(整数cur:整数)
{
结果.add(整数.valueOf(cur));
}
返回结果;
}
列出asList(最终整数[]整数){
返回新的AbstractList(){
公共整数get(整数索引){
返回整数[索引];
}
公共整数大小(){
返回整数.length;
}
};
}

不幸的是,我认为没有一种快速的方法可以做到这一点。我相信您必须迭代数组并逐个添加。

使用commons-lang3
org.apache.commons.lang3.ArrayUtils.toObject()
然后使用
java.util.Arrays.asList()

ArrayUtils.toObject()
将复制数组,而
array.asList()
将只创建由新数组支持的列表

int[] a = {1, 2, 3};
List<Integer> aI = Arrays.asList(ArrayUtils.toObject(a));
int[]a={1,2,3};
List aI=Arrays.asList(ArrayUtils.toObject(a));
编辑:如果希望通过列表界面添加新元素(调整大小),则此操作无效。如果希望能够添加新元素,则可以使用
new ArrayList()
,但这将创建一个副本。

导入java.util.Arrays;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class Listing {
  public static void main(String[] args) {

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

   java.util.List<Integer> list = new ArrayList<Integer>();
  for (int i=0; i< integers.length; i++)
  {
      list.add(integers[i]);
  }
  System.out.println(list);
}
}
导入java.util.ArrayList; 导入java.util.List; 公共类列表{ 公共静态void main(字符串[]args){ int[]整数={1,2,3,4}; java.util.List List=new ArrayList(); for(int i=0;i

测试和工作如预期

在我编辑之前,这个问题的第二部分有什么原因吗?@DJClayworth:我想没有。我已经标记了这个问题,并解释了我在提交这个问题时遇到了一些困难。@Merlyn:不是重复的。基元数组与对象数组不同arrays@Alexander:哇。这太糟糕了:)我不能取消投票,所以我将删除我的评论。有两个大问题:(1)列表由数组支持——也就是说,如果数组元素发生变化,列表元素也会发生变化。(2) 对于较大的整数,每次都会返回不同的整数——也就是说,不能期望引用相等。这两种行为可能是问题,也可能不是问题,但它们都是半令人惊讶的行为。在我添加(3)之前,Java真的可以这样做闭包吗?@cHao:3。是的,Java可以做这样的闭包!从技术上讲,这应该被命名为 列表,至少在假设Java在这方面遵循与.NET相同的命名约定时(在实际执行转换时,在同一集合上提供不同类型的视图)。它们是匿名类。@christoff,啊,是的,那么就没有问题了:我以为
add(…)
是在
AbstractList
中实现的。我的错,谢谢你的信息!为了提高效率,我可能会推荐
新的ArrayList(array.length)
。应该避免Java为了添加元素而必须调整集合的大小。您可以直接使用
List xValues=Arrays.asList(新整数[]{150、160、175、165})来实现这一点
@AlexanderPacha显然,它可以处理
整数[]
文本,但不能处理现有的
int[]
。无法将其放置在OP的方法框架中。
int[] a = {1, 2, 3};
List<Integer> aI = Arrays.asList(ArrayUtils.toObject(a));
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class Listing {
  public static void main(String[] args) {

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

   java.util.List<Integer> list = new ArrayList<Integer>();
  for (int i=0; i< integers.length; i++)
  {
      list.add(integers[i]);
  }
  System.out.println(list);
}
}